如何在Python多处理

时间:2018-05-26 15:25:13

标签: python python-3.x multiprocessing

我想将任务结果保存到队列中,任务在多个进程中运行。完成所有任务后,从队列中读取结果。

为什么在子任务中打印的队列大小是正确的,但在父进程中是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??

1 个答案:

答案 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答案中提供了替代方案,例如

在您的情况下,什么是最好的取决于您实际尝试使用该队列的内容。