Python 为什么在我调用task_done()后队列仍在加入?
蟒蛇3.6 首先我将一些项目放入队列中,然后启动一个线程并在主线程中调用队列的join(),然后在线程循环中调用get(),当队列的大小=0时,我调用task_done()并中断循环并退出线程。但是join()方法在主线程中仍然被阻塞。我想不出怎么了 下面是代码 谢谢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
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