【发布时间】:2015-10-18 08:39:41
【问题描述】:
我对python 3 中multiprocessing 模块中的队列有疑问
这是他们在programming guidelines中所说的:
请记住,已将项目放入队列的进程将在之前等待 终止,直到所有缓冲的项目都被“feeder”线程提供给 底层管道。 (子进程可以调用 Queue.cancel_join_thread 队列的方法来避免这种行为。)
这意味着每当您使用队列时,您需要确保所有 已放入队列的项目最终将在 过程加入。否则,您无法确定具有 放入队列中的项目将终止。还要记住非守护进程 进程将自动加入。
一个会死锁的例子如下:
从多处理导入进程,队列 定义 f(q): q.put('X' * 1000000) 如果 __name__ == '__main__': 队列 = 队列() p = 进程(目标 = f,参数 =(队列,)) p.start() p.join() # 这个死锁 obj = queue.get()这里的解决方法是交换最后两行(或简单地删除 p.join() 行)。
显然,queue.get() 不应该在 join() 之后调用。
但是有一些使用队列的示例,其中 get 在 join 之后被调用,例如:
import multiprocessing as mp
import random
import string
# define a example function
def rand_string(length, output):
""" Generates a random string of numbers, lower- and uppercase chars. """
rand_str = ''.join(random.choice(
string.ascii_lowercase
+ string.ascii_uppercase
+ string.digits)
for i in range(length))
output.put(rand_str)
if __name__ == "__main__":
# Define an output queue
output = mp.Queue()
# Setup a list of processes that we want to run
processes = [mp.Process(target=rand_string, args=(5, output))
for x in range(2)]
# Run processes
for p in processes:
p.start()
# Exit the completed processes
for p in processes:
p.join()
# Get process results from the output queue
results = [output.get() for p in processes]
print(results)
我已经运行了这个程序并且它可以工作(也作为 StackOverFlow 问题Python 3 - Multiprocessing - Queue.get() does not respond 的解决方案发布)。
有人可以帮我理解这里的死锁规则吗?
【问题讨论】:
标签: python multithreading