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

标签 python multithreading queue

我的代码如下,

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/

相关文章:

algorithm - 使用堆栈的 push & pop 操作实现队列

python - python 中的列表排列

python - 如何使用 while 循环创建乘法表?

python - 带有可变 WHERE 子句的批量更新表

python - OpenCV:将特定 BGR 值的所有像素设置为另一个 BGR 值

从线程触发时,C# ShowDialog() 不会阻塞主窗体

c++ - Qt永久线程

java - 字符和数字交替出现的字符串

c - 如果在这段代码中直接将变量 i 传递给线程会发生什么?

c# - 简单的内存消息队列