我想将任务结果保存到队列中,任务在多个进程中运行。完成所有任务后,从队列中读取结果。
为什么在子任务中打印的队列大小是正确的,但在父进程中是0? 我也无法在父级中获取队列数据。 如何解决这个问题?
Python3中的代码:
import multiprocessing
que = multiprocessing.Queue()
def task(n):
que.put(n)
print("Child: queue len is %d" % que.qsize())
if __name__ == '__main__':
pool = multiprocessing.Pool()
pool.map(task, range(10))
print("Parent: queue len is %d" % que.qsize())
输出:
Child: queue len is 1
Child: queue len is 2
Child: queue len is 3
Child: queue len is 4
Child: queue len is 5
Child: queue len is 6
Child: queue len is 7
Child: queue len is 8
Child: queue len is 9
Child: queue len is 10
Parent: queue len is 0 // Why here is not 10??
答案 0 :(得分:1)
在task
中运行pool.map
时,将导入包含函数task
的模块,并使用您在task
中指定的参数调用pool.map
。
因此,原始队列不会传递给它。导入模块时(在另一个进程中),将创建一个新的全局队列。
为了使行为更加明显,我稍微修改了一些示例,以便产生更多进程:
import multiprocessing
import time
que = multiprocessing.Queue()
def task(n):
que.put(n)
print("Child: queue len is %d" % que.qsize())
time.sleep(0.1)
if __name__ == '__main__':
pool = multiprocessing.Pool(10)
pool.map(task, range(10))
print("Parent: queue len is %d" % que.qsize())
现在打印:
Child: queue len is 1
Child: queue len is 1
Child: queue len is 2
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Child: queue len is 1
Parent: queue len is 0
要共享队列,您必须将其传递给其他进程,但无法通过map
完成。在其他几个SO答案中提供了替代方案,例如
在您的情况下,什么是最好的取决于您实际尝试使用该队列的内容。