gpt4 book ai didi

python - 在主线程中调用 queue.join() 对非主线程有何作用?

转载 作者:太空宇宙 更新时间:2023-11-03 11:46:22 26 4
gpt4 key购买 nike

我的代码如下,

import time, queue, threading

def washer(dishes, dish_queue):
for dish in dishes:
print ("Washing", dish)
time.sleep(1)
dish_queue.put(dish)

def dryer(dish_queue):
while True:
dish = dish_queue.get()
print("Drying", dish)
time.sleep(2)
dish_queue.task_done()
print('dryer')

dish_queue = queue.Queue()
for n in range(2):
dryer_thread = threading.Thread(target=dryer, args=(dish_queue,))
dryer_thread.start()

dishes = ['salad', 'bread', 'entree', 'desert']
washer(dishes, dish_queue)
dish_queue.join()

根据我对队列模块文档的理解,dish_queue.join() 将阻塞主线程,直到未完成任务(这里是未烘干的盘子)的计数回到 0。但我想知道 2 dryer_thread 发生了什么。

我发现如果我在主程序中的空 dish_queue 上运行函数 dryer,程序就会卡住(顺便说一句,这就是所谓的 dish_queue.block 吗?得到()?) 。因此,如果 dish_queue.join() 取消阻塞主线程,那么 2 dryer_thread 是否也取消阻塞并释放内存? block 在队列文档中是什么意思?

最佳答案

您的主要问题的简短答案是什么。

对于更长的答案,这里有两个并发图,一个没有等待: enter image description here

还有一个: enter image description here

如您所见,一开始两个烘干机线程都处于锁定状态,正如您正确理解的那样,这是 get() 的 block 。现在,在第一种情况下,主线程在完成清洗功能后结束。添加 dish_queue.join() 时,主线程等待 dish_queue 结束所有任务。所以当你说 join() 解除主线程的阻塞时,这意味着它删除了它自己的 block 。正如您所注意到的,其他线程完全不受其影响并保持阻塞状态。

至于什么是阻塞,就是线程或进程等待线程外的输入,或者在这种情况下,等待队列中的一个元素。如果您想停止其他线程,您需要向 get() 添加超时(这将抛出异常并终止线程),或者在 之后终止它们>dish_queue.join()

关于python - 在主线程中调用 queue.join() 对非主线程有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38715595/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com