Python 等待所有 fork 进程完成

标签 python fork

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

相关文章:

python - 如何允许在 CherryPy 中下载动态创建的文件?

python - 如何使用 Django REST 框架在 Spyder IDE 中启动新的 Web 应用程序

c - fork 三个通过管道交互的独立进程,等待它们完成,然后打印终止消息

python - 使顶级 python 模块可调用?

python - Pandas 面板合并

python - 使用 cython : all strings are empty 包装一个 c++ DLL

c - 通过管道 C 发送二进制数据

fork - 将互斥锁从父进程复制到子进程

linux - 是否可以使用 Linux 的 clone() 系统调用在同一地址空间中运行多个应用程序?

c++ - 与Boost中的dup2类似的功能