python-2.7 - Python多处理从队列中获取结果

标签 python-2.7 queue multiprocessing

我正在运行一个多处理脚本,该脚本应该在大约 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/

相关文章:

python - 如何获取有关Python "the specified module could not be found"的更多详细信息

python - 如何定义读取字符串元组的函数

python - 在类方法Python中调用多处理

python - 在 Linux 上使用多处理时不会出现 TKinter 窗口

python - 如何将 dict 转换为递归 defaultdict 并加载 JSON?

python - 加载pickled数据时cPickle EOFError

java - 同步队列是否在每个报价/放置上创建一个线程?

c - 堆栈和队列程序中的段错误

c - 与消息队列相关的问题

python - 共享内存和多处理