multiprocessing
模块的文档展示了如何将队列传递给使用multiprocessing.Process
启动的进程。但是我如何与使用apply_async
启动的异步工作进程共享一个队列呢?我不需要动态加入或其他任何东西,只需要一种方法让工作进程(反复)向基础进程报告其结果。
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
。
我理解了这个意思,并且我也理解了继承而不是要求pickle / unpickle(以及所有特殊的Windows限制)的建议。但是我该如何以能够正常工作的方式传递队列呢?我找不到示例,并且我尝试了几种失败了的替代方法。请帮忙?
Manager.Queue()
时,每个对象都需要进行两次pickle/unpickle操作,而不是普通队列的一次(一次用于发送到/从管理进程,另一次用于检索/放置对象在队列上)。其次,每个托管对象上的方法调用在调用方法之前需要花费1000倍的时间来解析。这些问题成为性能敏感应用程序的主要瓶颈,但实际上可能并不那么严重(1/2)。 - Charchit AgarwalManager.Queue()
(2/2)。 - Charchit Agarwal