我的 python 代码创建了一个巨大的哈希表(60GB+),将在其中执行许多繁重的只读操作。为了加快速度,在创建哈希表后,我将进程 fork 了几十次,以便每个操作都可以同时完成(48 核机器)。
一旦所有这些 fork 的子进程都完成了他们的事情,我希望合并他们的输出,所以我需要一种方法让父进程能够等待多个 pid。我如何实现这一目标?
fork 是这里的关键部分,因为我依靠将 fork 进程的内存页面映射到父进程的地址空间来减少占用空间。哈希表是由另一个库创建的,因此无法修改其实现。
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)
最佳答案
也许我把问题搞错了,但我看到了两个简单的解决方案:
如果您事先知道总共会有多少次操作,您可以将表中的写入与增加计数器结合起来。您的合并函数将休眠,直到计数器达到特定数字。
另一种可能更干净的方法是使用 celery .
首先您需要group您需要并行化的操作,然后 chain具有合并功能的组。
这将导致组内的所有任务作为链的第一部分并行处理,并且只有当组中的所有任务都完成时,链的第二部分(合并)才会激活。
关于Python 等待所有 fork 进程完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47011915/