Python线程从队列中获取项目 - 如何确定线程没有调用task_done()?

时间:2016-09-16 02:19:45

标签: python multithreading queue

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

会很好

1 个答案:

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