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

时间:2019-05-28 12:33:57

标签: python multithreading

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

1 个答案:

答案 0 :(得分:1)

应该为每个已出队和处理的工作项目调用

task_done,而不是一旦队列完全为空。 (没有理由-队列已经知道什么时候是空的。)join()将阻塞直到task_done被调用了与put一样的次数为止。

所以:

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

请注意,当工人看到空队列时,立即退出很奇怪。通常,它会get()处于阻塞状态,并且仅在有“时间退出”工作项离开队列时才退出。