我的代码如下
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意味着什么?在
你的主要问题的简短回答是什么都没有。在
要获得更长的答案,这里有两个并发图,其中一个没有等待:
还有一个是:
你可以看到,两个线程都在cd1的开头。现在,在第一种情况下,主螺纹在完成垫圈功能后完成。当添加
dish_queue.join()
时,主线程等待dish_队列结束所有任务。因此,当您说join()
取消阻止主线程时,意味着它删除了自己的块。正如您所注意到的,其他线程完全不受它的影响,并保持阻塞状态。在至于什么是块,是指线程或进程等待来自线程外部的输入,或者在本例中,等待队列中的a元素。如果您想停止其他线程,您需要为
get()
添加一个超时(这将引发一个异常并终止线程),或者在dish_queue.join()
之后终止它们。在相关问题 更多 >
编程相关推荐