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()
答案 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()
处于阻塞状态,并且仅在有“时间退出”工作项离开队列时才退出。