2013-09-05 24 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