2012-11-07 66 views
2

我在想如何檢查父線程是否仍然活着/卡住。基本上我有一個父線程發送命令給孩子。如果父母死亡或者遇到死鎖狀況,我不希望孩子繼續生活。以下是我迄今爲止實施的基本框架。檢查父線程是否正在運行

from Queue import Queue 
from threading import Thread 

    class myClass: 

     def __init__(self): 

      self.currentCommand = Queue()   
      t = Thread(target=self._run) 
      t.start()    

     def close(self): 
      self._sendCommand("close") 

     def _run(self): 
      while True: 
       if self.currentCommand.empty(): 
        pass 
        #do some task 
       else: 
        command = self.currentCommand.get() 
        if command == "close": 
         #clean up 
         self.currentCommand.task_done() 
         break 
        else: 
         #do command task 
         self.currentCommand.task_done() 

     def _sendCommand(self, command): 
      self.currentCommand.put(command) 
      self.currentCommand.join() 

我的一個想法是定期從父母向孩子發送計算機時間。如果時間超過設定值,孩子將會死亡。有沒有更容易或更有效的方法?另外在python文檔中,線程類中有一個isAlive方法,但我不確定如何使用它。

回答

1

您可以將一個Event對象向下傳遞給子線程,它可以檢查父級是否指示退出。然後,你只是包裝在父線程與finally關鍵部分,將設置該位不管是什麼:

import time 
from threading import Thread, Event 


def child(quit): 
    for _ in xrange(10): 
     if quit.isSet(): 
      print "Parent is dead. Leaving child." 
      return 

     print "Child alive" 
     time.sleep(.5) 

def parent(): 
    quitEvent = Event() 
    t = Thread(target=child, args=(quitEvent,)) 
    t.start() 

    try: 
     time.sleep(2) 
     raise Exception("Parent thread raises exception") 
    finally: 
     quitEvent.set() 

    t.join() 


if __name__ == "__main__": 
    t = Thread(target=parent, args=()) 
    t.start() 
    t.join() 

雖然在它自己的工作父線程死鎖的事情可能會需要一個「心跳「像你所建議的那樣,它定期表明它還活着。您可以通過傳遞給孩子的隊列來實現,也可以繼續使用Event對象。父母會週期性地設置事件,並且孩子會期望它按照一定的時間間隔設置,然後馬上清除它。

下面是一個使用Event的心跳,在案件的例子,其中母公司可能陷入僵局並沒有檢查:

def child(heartbeat): 
    for _ in xrange(10): 
     if not heartbeat.isSet(): 
      print "Parent is dead. Leaving child." 
      return 

     heartbeat.clear() 

     print "Child alive" 
     time.sleep(1) 

def parent(): 
    heartbeat = Event() 
    heartbeat.set() 

    t = Thread(target=child, args=(heartbeat,)) 
    t.start() 

    i = 0 
    while i < 20: 
     print "Parent alive" 
     i += 1 
     heartbeat.set() 
     time.sleep(.1) 

    print "Parent done looping...pretending to be deadlocked" 
    time.sleep(5) 

    t.join() 

由於父母是做什麼的自己的作品,它是設置心跳位。孩子正在定期檢查這一點。如果它發現父母沒有設置,那麼它認爲它已經死亡並退出。您需要建立合適的心跳間隔。家長需要經常檢查,而不是孩子檢查它,或者孩子可能很快檢查並認爲父母不在家。

1

它可以使用isAlife,如果你以某種方式與孩子共享父線程對象:

parent_thread = None 

def child(): 
    while True: 
     time.sleep(1) 
     if not parent_thread.isAlive(): 
      break 
     print('child alife') 


def parent(): 
    t = threading.Thread(target=child) 
    t.start() 
    for i in range(10): 
     print('parent alife') 
     time.sleep(1) 

parent_thread = threading.Thread(target=parent) 
parent_thread.start() 
相關問題