Python等待所有分叉进程完成

时间:2017-10-30 09:34:39

标签: python fork

我的python代码创建了一个巨大的哈希表(60GB +),在该表上将执行许多繁重的只读操作。为了加快速度,我在创建哈希表后将进程分叉几次,以便每个操作可以同时完成(48核机器)。

一旦所有这些分叉的孩子完成了他们的事情,我希望合并他们的输出,所以我需要一种方法让父进程能够等待多个pid。我如何实现这一目标?

分叉是这里的关键部分,因为我依赖分叉进程的内存页面映射到父地址空间来减少占用空间。哈希表由另一个库创建,因此修改其实现不是一种选择。

children = []
for index in batch:
    tracks = batch[index]
    pid = os.fork()
    if pid == 0:
        # forked process
        run_batch(tracks, index)
    else:
        # main process
        children.append(pid)
        print('spawned child ', pid)

1 个答案:

答案 0 :(得分:1)

也许我的问题出错了,但我看到了两个简单的解决方案:

如果您事先知道,总共会有多少次操作,您可以将表格中的书写与扩充计数器结合起来。您的合并功能将一直睡眠,直到计数器达到一定数量。

另一种可能更简洁的方法是使用celery

首先,您需要group需要并行化的操作,然后chain具有合并功能的组。

这将导致组内的所有任务作为链的第一部分并行处理,并且只有当组中的所有任务完成时,链的第二部分即合并才会被激活。