我的代码如下,
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.block 吗?得到()?) 。因此,如果 dish_queue.join()
取消阻塞主线程,那么 2 dryer_thread 是否也取消阻塞并释放内存? block 在队列文档中是什么意思?
最佳答案
您的主要问题的简短答案是什么。
如您所见,一开始两个烘干机线程都处于锁定状态,正如您正确理解的那样,这是 get()
的 block 。现在,在第一种情况下,主线程在完成清洗功能后结束。添加 dish_queue.join()
时,主线程等待 dish_queue 结束所有任务。所以当你说 join()
解除主线程的阻塞时,这意味着它删除了它自己的 block 。正如您所注意到的,其他线程完全不受其影响并保持阻塞状态。
至于什么是阻塞,就是线程或进程等待线程外的输入,或者在这种情况下,等待队列中的一个元素。如果您想停止其他线程,您需要向 get()
添加超时(这将抛出异常并终止线程),或者在 之后终止它们>dish_queue.join()
。
关于python - 在主线程中调用 queue.join() 对非主线程有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38715595/