我想将任务结果保存到队列中,任务在多个进程中运行。完成所有正在运行的任务后,从队列中读取结果。
为什么子任务中打印的队列大小是正确的,但在父进程中的队列大小为 0? 我也无法在父级中获取队列数据。 如何解决这个问题?
Python 3 中的代码:
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??
当您在pool.map
中运行task
时,将导入包含函数task
的模块,并使用您在pool.map
中指定的参数调用task
。
因此,原始队列不会传递给它。导入模块(在另一个进程中(时,将创建一个新的全局队列。
为了使行为更加明显,我稍微修改了您的示例,以便它产生更多进程:
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 答案中还提供了替代方案,例如
- 在 python 中填充队列和管理多处理
- 多处理池和队列
在您的情况下,什么最好取决于您实际尝试对该队列执行的操作。