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()
问题:
在worker func中,dispQ.qsize为0,job正在创建更多项,从而中断循环(在中断循环后,dispQ中有更多作业)
我需要做类似的事情:
如果dispQ.qsize()== 0并且在worker func中没有正在处理的项目,则跳出while循环
即。在调用get()之后,task_done()尚未调用
如果它有一个带超时的dispQ.join()
会很好答案 0 :(得分: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()