2013-09-05 67 views
0

我在那有一個事件處理循環庫寫一個類管理事件循環程序,但這意味着它可能會在處理中被殺。我真的想等待當前的處理迭代完成後才能殺死。在一個線程

通常在這些情況下,在while循環中會檢查一個標誌,並且有一種方法 - stop(),比如說 - 設置它爲False。如果可能的話,我寧願避免這種要求。

下面認爲不好嗎?

def _process_loop(self): 
     while True: 
      event = self.queue.get() 
      self.thread.daemon = False 
      self._handle_event(event) 
      self.thread.daemon = True 

編輯:是的,它是不好:RuntimeError: cannot set daemon status of active thread

什麼是正確的方式來實現這一目標?

+0

退出while循環的標誌有什麼不好?這就是我會用的。 – dwxw

+0

如果還有其他方法,我寧願避免這種情況。它使客戶端的責任停止後臺進程。 – quornian

回答

0

繼續從umläute的回答(從父線程接收信息的子想法),我意識到我可以監視父線程的狀態。

使線程非守護進程消除退出中間處理的問題。然後檢查父線程,看看它是否仍然在運行,我可以完全退出:

class EventSystem(object): 

    def __init__(self): 
     self.queue = Queue.Queue() 
    self.parent_thread = threading.current_thread()   # <-- Added 
    self.thread = threading.Thread(target=self_process_loop) 
    self.thread.start() 

def _process_loop(self): 
    while self.parent_thread.is_alive():     # <-- Changed 
     try: 
      event = self.queue.get(timeout=1)    # <-- Timeout added 
     except Queue.Empty: 
      continue 
     else: 
      self._handle_event(event) 

def _handle_event(self, event): 
    ... 

這就引入了投票,但不要求客戶參加與,或停止,後臺線程一個可行的解決方案。

0

你的想法是正確的,你應該(見注中this documentation)使用標誌,但是你不能使用內部daemon屬性作爲標誌,因爲它會返回一個錯誤。

Documentation在Python:

守護程序
一個布爾值,它指示該線程是否是守護線程(True)或否(false)。這必須在調用start()之前設置,否則會引發RuntimeError。它的初始值是從創建線程繼承的;主線程不是守護進程線程,因此在主線程中創建的所有線程都默認爲守護程序= False。

所以你應該創建另一個變量作爲標誌。

1
  • 使用控制生命週期

  • 聽清楚「殺死」你的守護

  • 每當信號時,設定的終止條件,信號條件變量,所以守護進程退出一旦它處理完所有事件

+0

是否有信號發送給子線程?我認爲信號是過程級的。如果有一個可以處理,這將是一個很好的解決方案。你有任何細節? – quornian