什么叫什么队列.join()在主线程中对非主线程做什么?

2024-09-28 03:13:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我的代码如下

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_队列.join()将阻塞主线程,直到未完成任务的计数(这里是未烘干的盘子)回到0。我在想干衣机怎么了。在

我发现,如果我在主程序的一个空的dish_queue上运行函数dryer,程序就会卡住(顺便说一句,这就是所谓的dish块吗_队列.get()?) . 因此,如果dish_queue.join()解除了对主线程的阻塞,那么2号干燥器线程是否也会解除阻塞并释放内存?在队列文档中,block意味着什么?在


Tags: inforgettime队列queuedefsleep
1条回答
网友
1楼 · 发布于 2024-09-28 03:13:40

你的主要问题的简短回答是什么都没有。在

要获得更长的答案,这里有两个并发图,其中一个没有等待: enter image description here

还有一个是: enter image description here

你可以看到,两个线程都在cd1的开头。现在,在第一种情况下,主螺纹在完成垫圈功能后完成。当添加dish_queue.join()时,主线程等待dish_队列结束所有任务。因此,当您说join()取消阻止主线程时,意味着它删除了自己的块。正如您所注意到的,其他线程完全不受它的影响,并保持阻塞状态。在

至于什么是块,是指线程或进程等待来自线程外部的输入,或者在本例中,等待队列中的a元素。如果您想停止其他线程,您需要为get()添加一个超时(这将引发一个异常并终止线程),或者在dish_queue.join()之后终止它们。在

相关问题 更多 >

    热门问题