2015-11-20 59 views
0

我想知道:在主應用程序收到SIGINT的情況下,殺死主Python應用程序啓動的線程的最佳實踐是什麼?Python;殺死其他線程的最佳實踐

我做下面的事情,但我強烈懷疑,因爲需要殺死其他發表的主題是這樣一個共同的問題,那有可能是一個更好的方式來做到這一點:

class Handler(threading.Thread): 
    def __init__(self): 
     threading.Thread.__init__(self) 
     self.keep_go = True 

    def run(self): 
     while self.keep_go: 
      #do something 

    def stop(self): #seems like i shouldn't have to do this myself 
     self.keep_go = False 
try: 
    h = Handler() 
    h.start() 
    while True: #ENTER SOME OTHER LOOP HERE 
     #do something else 
except KeyboardInterrupt: #seems like i shouldn't have to do this myself 
    pass 
finally: 
    h.stop() 

以下職位是相關的,但是我不清楚實際推薦的做法是什麼,因爲答案更多的是「這裏有一些可能的做法,你可以做到這一點」。另外,我不需要「突然」殺掉某些東西。我可以這樣做「正確的方式」:Is there any way to kill a Thread in Python?

編輯:我想我的方法有一個小缺陷是它不會終止while循環中的當前處理。它不會收到一個「殺死事件」,將該循環作爲事務「滾動」回來,也不會停止循環的其餘部分。

+0

它看起來像你在你的代碼中複製錯誤; 'try'丟失。 – dano

+0

你上面粘貼的代碼並沒有做你認爲它會做的事:'h.start()'不會阻塞,所以'h.stop()'立即被調用,導致線程停止,並且整個程序退出。 – dano

+0

我不是專家,但這也是我完成關閉線程的方式。如果你有一個線程的功能是連續運行的(例如,監視某個事物的狀態),那麼如果沒有某種方式讓它停止,比如你現在做什麼,它會知道如何停下來? – Dval

回答

2

我通常只是將每個線程的daemon屬性設置爲True。這樣,當主線程終止時,其他所有事情也一樣。

documentation擁有多一點就此事說:

守護線程突然停在關機。他們的資源(如打開文件,數據庫事務等)可能無法正確釋放。如果你希望你的線程正常停止,使它們不是守護進程,並使用合適的信號機制,如事件。

+1

@Tommy如果你不*需要*正常關閉你的後臺線程,這裏給出的方法是好的。如果你這樣做,那麼做你的榜樣是正確的。 – dano

+0

我想我的方法有一個小缺陷,就是它不會在While循環中終止當前的處理。它不會收到一個kill事件,將事務「循環」回來。我用這個問題編輯了我的問題。 – Tommy