首页 > 解决方案 > 在 Python 中启动多个 C 进程

问题描述

我有两个程序,一个用 C 编写,一个用 Python 编写。我想从 Python 向 C 程序传递一些参数并并行执行多次,因为我有大约 100 万个这样的 C 调用。

基本上我是这样做的:

from subprocess import check_call
import multiprocessing as mp
from itertools import combinations

def run_parallel(f1, f2):
    check_call(f"./c_compiled {f1} {f2} &", cwd='.', shell=True)

if __name__ == '__main__':
        pairs = combinations(fns, 2)

        pool = mp.Pool(processes=32)
        pool.starmap(run_parallel, pairs)
        pool.close()

但是,有时我会收到以下错误(尽管主进程仍在运行)

/bin/sh: fork: retry: 没有子进程

此外,有时 Python 中的整个程序会失败

BlockingIOError: [Errno 11] 资源暂时不可用

我发现当它仍在运行时,我可以看到为我的用户生成了很多进程(大约 500 个),而我最多有 512 个可用。

这不会一直发生(取决于论点),但它经常发生。我怎样才能避免这些问题?

标签: pythonmultiprocessing

解决方案


我敢打赌你会遇到进程/文件描述符/...限制。

您可以通过不使用来“保存”每次调用的一个进程shell=True

check_call(["./c_compiled", f1, f2], cwd='.')

但最好还是让 C 代码可以从 Python 调用,而不是创建进程来这样做。到目前为止,将“随机”C 代码与 Python 接口的最简单方法是Cython


推荐阅读