[英]Too many open files error with python multiprocessing
我在使用多处理(下文称为mp
)的 python(v3.7)脚本时遇到了多个问题。 其中之一是我的计算以“OSError: [Errno 24] Too many open files”结束。 我的脚本和模块很复杂,所以我将问题分解为以下代码:
def worker(n):
time.sleep(1)
n = 2000
procs = [mp.Process(target=worker, args=(i,)) for i in range(n)]
nprocs = 40
i = 0
while i<n:
if (len(mp.active_children())<=nprocs):
print('Starting proc {:d}'.format(i))
procs[i].start()
i += 1
else:
time.sleep(1)
[p.join() for p in procs]
当执行了大约 ~ 1020 个进程时,此代码将失败。 我一直以类似的方式使用多处理而没有遇到这个问题,我在大约 120 CPU 的服务器上运行它。 最近我从 Python 2.7 切换到 3.7,我不知道这是否会成为问题。
这是完整的跟踪:
Traceback (most recent call last):
File "test_toomanyopen.py", line 18, in <module>
procs[i].start()
File "/p/jqueryrel/local_install/conda_envs/trois/lib/python3.7/multiprocessing/process.py", line 112, in start
self._popen = self._Popen(self)
File "/p/jqueryrel/local_install/conda_envs/trois/lib/python3.7/multiprocessing/context.py", line 223, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "/p/jqueryrel/local_install/conda_envs/trois/lib/python3.7/multiprocessing/context.py", line 277, in _Popen
return Popen(process_obj)
File "/p/jqueryrel/local_install/conda_envs/trois/lib/python3.7/multiprocessing/popen_fork.py", line 20, in __init__
self._launch(process_obj)
File "/p/jqueryrel/local_install/conda_envs/trois/lib/python3.7/multiprocessing/popen_fork.py", line 69, in _launch
parent_r, child_w = os.pipe()
OSError: [Errno 24] Too many open files
我在这里看到了类似的问题,但我不知道如何解决这个问题。
谢谢
要将评论放入答案中,有几个选项可以解决此问题:
/etc/security/limits.conf
。 例如看这里。Pool
可能有助于重构您的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.