Python等待所有分叉进程完成

Python等待所有分叉进程完成,python,fork,Python,Fork,我的python代码创建了一个巨大的哈希表(60GB+),在这个哈希表上要执行大量的只读操作。为了加快速度,一旦创建了哈希表,我会将这个过程分叉几十次,这样每个操作都可以并发完成(48核机器) 一旦所有这些分叉的子进程都完成了它们的事情,我希望合并它们的输出,因此我需要一种方法使父进程能够等待多个pid。我如何做到这一点 分叉是这里的一个关键部分,因为我依赖于分叉进程的内存页映射到父级的地址空间以减少占用空间。哈希表是由另一个库创建的,因此不能修改它的实现 children = [] for i

我的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)

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

如果您事先知道总共有多少个操作,您可以将在表中写入操作与增加计数器结合起来。合并函数将一直休眠,直到计数器达到某个数字

另一种可能更干净的方法是使用

首先,需要对需要并行化的操作进行分析,然后使用合并函数对组进行分析


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

只需使用
os。等待
@Daniel它不起作用<代码>操作系统。等待
只等待一个进程,我至少有12个。不在订单上中继。请描述一下,为什么不能使用
wait
@Daniel如果在while循环中使用wait,直到所有孩子都退出,那么它将按照该答案中的建议工作。但我仍然认为发布的代码依赖于特定的顺序。如果没有每个
waitpid
调用返回,for循环将无法继续。不管怎样,这个答案仍然解决了我的问题,所以谢谢。看来你真的搞错了。一旦哈希表被完全写入,子项就被分叉。此外,它们需要分叉,以避免每个进程使用60GB,芹菜不能做到这一点。