主线程中对queue.join()的调用对非主线程有什么影响?

时间:2016-08-02 08:38:49

标签: 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 dry_thread发生了什么。< / p>

我发现如果我在主程序中的空dryer上运行函数dish_queue,程序就会卡住(BTW,这是所谓的来自dish_queue.get()的块吗?)。因此,如果dish_queue.join()取消阻塞主线程,那么2个dryer_thread也会解锁并释放内存吗? 阻止 在队列doc中意味着什么?

1 个答案:

答案 0 :(得分:1)

对你的主要问题的简短回答是什么。

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

一个人: enter image description here

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

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