python – 主线程中对queue.join()的调用对非主线程有什么影响?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 主线程中对queue.join()的调用对非主线程有什么影响?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1467字,纯文字阅读大概需要3分钟。
内容图文
![python – 主线程中对queue.join()的调用对非主线程有什么影响?](/upload/InfoBanner/zyjiaocheng/773/d5707cc46c594d6ca6ac3ebb80798b97.jpg)
我的代码如下,
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上运行函数干燥器,程序就会卡住(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()的调用对非主线程有什么影响?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。