我的代码如下,主线程中的queue.join()调用对非主线程有什么作用?
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
上运行函数dryer
,程序会卡住(顺便说一下,这是从dish_queue.get()?)所谓的块)。因此,如果dish_queue.join()
解锁主线程,那么2 dryer_thread是否也会解锁并释放内存?什么块意味着无论如何在队列文件?
除了设置超时值之外,您还有什么建议终止其他线程?我不确定是否将其他线程设置为守护进程。另外,如果我不改变我的代码,只是让他们阻止,他们真的消耗我的记忆? – Nicholas
顺便说一句,你使用什么并发监视器?这很优雅! – Nicholas
通常情况下,带有块的线程与睡眠线程相同。它不会释放它的内存,但也不会消耗任何额外的资源,所以基本上取决于你将来是否需要该线程。需要注意的是,只要主线程处于活动状态,线程就会在那里,因此您不应该打开新线程,而是将新元素添加到现有队列中。 我使用pyCharm,这是一个很棒的IDE。 – Aruj