2010-11-09 82 views
19

我讀的地方,KeyboardInterrupt異常只能由在Python主線程讀取。我還讀到主線程在執行子線程時被阻塞。那麼,這是否意味着CTRL +ç可以永遠無法達到的子線程。我嘗試以下的代碼:按Ctrl-C,即一個KeyboardInterrupt殺死線程在python

def main(): 
    try: 
     thread1.start() #thread is totally blocking e.g. while (1) 
     thread1.join() 
    except KeyboardInterrupt: 
     print "Ctrl-c pressed ..." 
     sys.exit(1) 

在這種情況下,存在的CTRL + Ç上的執行沒有影響。這就像它不能聽中斷一樣。我的理解是錯誤的嗎?是否有任何其他的方式來殺死使用CTRL +ç線程?

+0

見http://stackoverflow.com/questions/323972/is-there -any-way-to-kill-a-thread-in-python – 2010-11-09 17:33:31

+5

您的主線程未被阻止,因爲您啓動了另一個線程。如果這是真的,那麼線索的意義何在?這是因爲你調用了thread1.join(),它會阻塞直到thread1完成。 – Falmarri 2010-11-09 17:42:59

回答

9

的問題還有就是你正在使用thread1.join(),這將導致你的程序等到線程完成繼續。

的信號將總是由主進程被抓住,因爲它是接收信號的一個,它是有螺紋的過程。

做它告訴你,你基本上是運行一個「正常」的應用程序,而線程的功能,當你開始1個線程並等待它完成就可以繼續。

12

如果你想有主線程接收CTRL +ç加盟信號,可以通過增加超時join()調用來完成。

以下似乎是工作(不要忘記加上daemon=True如果你想主真正結束):

thread1.start() 
while True: 
    thread1.join(600) 
    if not thread1.isAlive(): 
     break