我正在运行一个多处理脚本,该脚本应该在大约 0.01 秒内启动 2.000.000 个作业。每个作业都将结果放入从 Queue 导入的队列中,因为来自 Multiprocessing 模块的队列无法处理超过 517 个结果。
我的程序在从队列中获取结果之前卡住了。这是我的多进程函数的核心:
while argslist != []:
p = mp.Process(target=function, args=(result_queue, argslist.pop(),))
jobs.append(p)
p.start()
for p in jobs:
p.join()
print 'over'
res = [result_queue.get() for p in jobs]
print 'got it'
输出:“结束”但从未“得到它”
当我更换时
result_queue.get()
由
result_queue.get_nowait()
我收到了 raise Empty 错误,表示我的队列为空...
但是如果我在内部函数中的queue.put()之后执行queue.get(),那么它就会起作用,向我表明队列已由我的函数很好地归档。
最佳答案
queue.Queue
不在进程之间共享,因此它不起作用,您必须使用 multiprocessing.Queue
。
为了避免死锁,在从队列中获取结果之前,不应加入进程。 multiprocessing.Queue
有效地受到其底层管道缓冲区的限制,因此,如果缓冲区已满,则无法将更多项目刷新到管道,并且 queue.put()
将阻塞直到消费者调用 queue.get()
,但如果消费者正在加入一个被阻止的进程,那么就会出现死锁。
您可以通过使用 multiprocessing.Pool
及其 map()
来避免所有这些情况。相反。
关于python-2.7 - Python多处理从队列中获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30320623/