2014-02-10 4 views
0

2 가지 유형의 스레드 클래스를 생성하는 프로세스가 있습니다. 하나의 스레드는 job_queue (이 클래스의 100Threads가 일반적으로 실행 중임)를 사용합니다. 두 번째 스레드는 죽이는 스레드입니다. thread2에서 설정되는 result_done 플래그를 사용하고 있는데 문제는 내 threads1이 X 초 동안 기다린 다음 result_done 플래그가 설정되어 있는지 확인합니다. maxtimeout가 5백초로 설정하고 내가 다른 스레드에서 result_done 플래그를 설정하면 (큐에 데이터가 존재하지 않는 경우)같은 프로세스의 스레드에서 모든 스레드와 프로세스를 강제 종료합니다.

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

지금,이 스레드가 종료하기 전에 500초 기다립니다.

내가 달성하고자하는 것은 result_done 이벤트가 프로세스의 모든 스레드에서 설정되는 즉시 db, websocket, http 연결 등을 적절하게 종료하면서 모든 스레드가 현재 프로세스와 함께 정상적으로 종료된다는 것입니다.

저는 파이썬 다중 프로세스 라이브러리를 사용하여 이러한 스레드를 생성하는 프로세스를 만듭니다.

업데이트 : 모든 스레드는 daemon = True threads입니다. maxtimeout 대기 시간을 방지하기 위해

+0

스레드를 중단없이 정상적으로 종료하려면 스레드를 비 데몬 스레드로 만들어야합니다. – gravetii

답변

0

, 당신은 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을 기다리지 않고.