Python 为什么在我调用task_done()后队列仍在加入?

Python 为什么在我调用task_done()后队列仍在加入?,python,multithreading,Python,Multithreading,蟒蛇3.6 首先我将一些项目放入队列中,然后启动一个线程并在主线程中调用队列的join(),然后在线程循环中调用get(),当队列的大小=0时,我调用task_done()并中断循环并退出线程。但是join()方法在主线程中仍然被阻塞。我想不出怎么了 下面是代码 谢谢 import queue import threading def worker(work_queue): while True: if work_queue.empty(): p

蟒蛇3.6

首先我将一些项目放入队列中,然后启动一个线程并在主线程中调用队列的join(),然后在线程循环中调用get(),当队列的大小=0时,我调用task_done()并中断循环并退出线程。但是join()方法在主线程中仍然被阻塞。我想不出怎么了

下面是代码

谢谢

import queue
import threading

def worker(work_queue):
    while True:
        if work_queue.empty():
            print("Task 1 Over!")
            work_queue.task_done()
            break
        else:
            _ = work_queue.get()
            print(work_queue.qsize())
            # do actual work

def main():
    work_queue = queue.Queue()
    for i in range(10):
        work_queue.put("Item %d" % (i + 1))

    t = threading.Thread(target=worker, args=(work_queue, ))
    t.setDaemon(True)
    t.start()
    print("Main Thread 1")
    work_queue.join()
    print("Main Thread 2")
    t.join()
    print("Finish!")

if __name__ == "__main__":
    main()

应为每个已出列和处理的工作项调用
任务\u done
,而不是在队列完全为空时调用。(没有理由——队列已经知道它什么时候是空的。)
join()
将阻塞,直到调用
task\u done
的次数与调用
put
的次数相同

因此:

请注意,工作人员一看到空队列就立即退出是很奇怪的。通常情况下,它将使用阻塞
get()
,并且仅当它从队列中获得“退出时间”工作项时才退出

def worker(work_queue):
    while True:
        if work_queue.empty():
            print("Task 1 Over!")
            break
        else:
            _ = work_queue.get()
            print(work_queue.qsize())
            # do actual work