2016-09-16 26 views
1
dispQ = Queue.Queue() 
stop_thr_event = threading.Event() 

def worker (stop_event): 
    while not stop_event.wait(0): 
     try: 
      job = dispQ.get(timeout=1) 
      job.do_work() # does some work and may put more jobs in the dispQ 
      dispQ.task_done() 
     except Queue.Empty, msg: 
      continue 


t1 = threading.Thread(target=worker, args=(stop_thr_event,)) 
t1.daemon = True 
t1.start() 

t2 = threading.Thread(target=worker, args=(stop_thr_event,)) 
t2.daemon = True 
t2.start() 

# put some initial jobs in the dispQ here 

while True: 
    if dispQ.qsize() == 0: 
     break 
    else: 
     # do something important 

stop_thr_event.set() 
t1.join() 
t2.join() 

問題:
dispQ.qsize爲0,當工人FUNC內,工作是創造更多的項目,並因此終止循環(終止循環後,也有dispQ更多的就業機會)Python線程從隊列中獲取項目 - 你如何確定線程沒有調用task_done()?

我需要做的是這樣的:
如果dispQ.qsize()== 0並沒有被項目工人FUNC內的工作,然後跳出while循環

稱爲沒有從中得到後

即task_done()處理不當( )被稱爲

這將是很好,如果它有dispQ.join()與超時

回答

1

這裏是Queue.join的來源,它看起來像你可以只使用queue.unfinished_tasks > 0來檢查任何任務正在運行或隊列。您可能需要獲取(然後釋放)鎖,以確保在檢查其狀態時隊列不會更改。 (我相信)如果您可以保證在最後一項任務完成後沒有任何項目將被添加到隊列中,則不需要執行此操作。

def join(self): 
    # ... 
    self.all_tasks_done.acquire() 
    try: 
     while self.unfinished_tasks: 
      self.all_tasks_done.wait() 
    finally: 
     self.all_tasks_done.release() 
+0

是的,我認爲這會奏效。謝謝 – ealeon