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

python – 主线程中对queue.join()的调用对非主线程有什么影响?,第1张

概述我的代码如下, import time, queue, threadingdef washer(dishes, dish_queue): for dish in dishes: print ("Washing", dish) time.sleep(1) dish_queue.put(dish)def dryer(dish_qu 我的代码如下,

import time,queue,threadingdef 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上运行函数干燥器,程序就会卡住(BTW,这是所谓的来自dish_queue.get()的块吗?).因此,如果dish_queue.join()取消阻塞主线程,那么2个dryer_thread也会解锁并释放内存吗?在队列doc中,块的含义是什么?

解决方法 对你的主要问题的简短回答是什么.

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

还有一个:

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

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

总结

以上是内存溢出为你收集整理的python – 主线程中对queue.join()的调用对非主线程有什么影响?全部内容,希望文章能够帮你解决python – 主线程中对queue.join()的调用对非主线程有什么影响?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1197677.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-03
下一篇 2022-06-03

发表评论

登录后才能评论

评论列表(0条)

保存