2012-11-07 2 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() 

내가 가진 한 가지 아이디어는 부모로부터 아이에게 컴퓨터 시간을 주기적으로 보내는 것입니다. 시간이 설정된 값보다 크면 어린이가 사망합니다. 더 쉽거나 더 효과적인 방법이 있습니까? 또한 파이썬 설명서 내에서 스레딩 클래스 내에 isAlive 메서드가 있지만 사용 방법을 잘 모르고 있습니다.

답변

1

Event 개체를 자식 스레드로 전달하면 부모가 종료되었음을 나타내는 지 확인할 수 있습니다. 그것의 자신의 일 동안 부모 스레드 죽은 잠금의 문제는 아마 "하트 비트를 필요로

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() 

있지만 : 그럼 그냥 무슨 상관없이 비트를 설정하지 것이다 finally와 부모 스레드에서 중요한 부분을 감싸 "당신이 제안한 것과 같은 방식으로, 그것이 살아 있다는 것을 주기적으로 나타냅니다. 자식에게 전달한 대기열을 사용하여 수행 할 수도 있고 계속해서 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() 

가 설정된다 : 부모가 교착과에 확인되지 않을 수도 있습니다 경우 여기

는 경우, 하트 비트로 Event를 사용하는 예입니다 하트 비트. 아이가 정기적으로이 비트를 검사하고 있습니다. 부모가 설정되지 않았다면 부모는 그것이 죽었다고 가정하고 종료합니다. 적절한 하트 비트 간격을 설정해야합니다. 부모는 자녀가 확인하는 것보다 더 자주 체크인해야하거나, 자녀가 곧 확인하고 부모가 사라 졌다고 생각할 수도 있습니다.

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() 
관련 문제