2014-02-10 119 views
0

我有一個生成2類線程類的進程。一個線程負責消耗一個job_queue(這個類的100個線程通常運行)。第二個線程是一個殺死線程。我正在使用從thread2設置的result_done標誌,問題是我的threads1等待X秒,然後檢查是否設置了result_done標誌。現在從同一進程的線程中kill所有線程和進程

def run(self): 
    while True: 
     try: 
      val = self.job_queue.get(True,self.maxtimeout) 
     except: 
      pass 
     if self.result_done.isset(): 
      return 

,如果maxtimeout設置爲500秒和我設置result_done標誌從另一個線程,該線程將等待500秒退出之前(如果在隊列中沒有數據)。

我想要實現的是,所有線程都隨着當前進程優雅地死掉,只要從進程的任何線程設置了result_done事件,就會正確終止db,websocket,http連接等。

我正在使用python多進程庫來創建產生這些線程的進程。

更新:所有線程都是守護進程=真正的線程。

+0

如果您希望線程平穩地死去,您需要使它們成爲非守護線程。 – gravetii

回答

0

爲了避免等待時間maxtimeout,你可以使用Event.wait() method

def run(self): 
    while not self.result_done.is_set(): 
     try: 
      val = self.job_queue.get_nowait() 
     except Empty: 
      if self.result_done.wait(1): # wait a second to avoid busy loop 
       return 

Event.wait(timeout)不返回如果調用過程中設置事件等待完整timeout