multiprocessing
模块的文档显示了如何将队列传递给以multiprocessing.Process
开头的进程。但是,如何与以apply_async
启动的异步工作进程共享队列?我不需要动态连接或其他任何东西,只需要让工人(反复)将结果报告给base。
import multiprocessing
def worker(name, que):
que.put("%d is done" % name)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=3)
q = multiprocessing.Queue()
workers = pool.apply_async(worker, (33, q))
失败的原因是:
RuntimeError: Queue objects should only be shared between processes through inheritance
。
我理解这意味着什么,我理解继承的建议,而不是要求酸洗/脱皮(以及所有特殊的Windows限制)。但是,我如何以一种有效的方式传递队列呢?我找不到一个例子,我试过几种不同的方法,但都失败了。请帮忙?
尝试使用multiprocessing.Manager来管理队列,并使不同的工作人员可以访问它。
multiprocessing.Pool
已经有一个共享结果队列,不需要另外涉及一个Manager.Queue
。Manager.Queue
是一个位于引擎盖下的^{Manager.Queue
中的结果也不能保证被排序。工作进程不是以
.apply_async()
开始的,这在实例化Pool
时已经发生。什么是开始的 当你调用pool.apply_async()
是一个新的“作业”。池的工作进程在引擎盖下运行multiprocessing.pool.worker
-函数。此函数负责处理通过池的内部Pool._inqueue
传输的新“任务”,并通过Pool._outqueue
将结果发送回父级。指定的func
将在multiprocessing.pool.worker
内执行。func
只需return
一些内容,结果将自动发送回父级。.apply_async()
立即(异步)返回一个^{ApplyResult
的别名)。您需要对该对象调用.get()
(正在阻塞)以接收实际结果。另一个选择是注册一个callback函数,一旦结果就绪,它就会被触发。示例输出:
注意:为
.get()
指定timeout
参数不会停止工作进程中任务的实际处理,它只会通过引发multiprocessing.TimeoutError
来解除阻止等待的父进程。相关问题 更多 >
编程相关推荐