python - 在 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 个可用。
这不会一直发生(取决于论点),但它经常发生。我怎样才能避免这些问题?
解决方案
我敢打赌你会遇到进程/文件描述符/...限制。
您可以通过不使用来“保存”每次调用的一个进程shell=True
:
check_call(["./c_compiled", f1, f2], cwd='.')
但最好还是让 C 代码可以从 Python 调用,而不是创建进程来这样做。到目前为止,将“随机”C 代码与 Python 接口的最简单方法是Cython。
推荐阅读
- javascript - 如何在javascript中复制symfony passwordEncode
- html - Angular - TypeError:无法读取未定义的属性“名称”
- powerbi - 重命名后查找默认表名
- docker - 如何将设备标志添加到现有的 docker 容器?
- javascript - 如何修复我的算法以使用周数来构建日历?
- bash - 从 txt 文件中删除确切的名称
- sql - SQL Server 查询对记录进行分组并插入到其他表中
- javascript - 秒表无法正常工作
- javascript - 正确的归并排序
- composer-php - 作曲家可以使用局部变量来指定存储库版本吗?