我在使用多处理的python(v3.7(脚本(以下称为mp
(时遇到了多个问题。其中之一是我的计算以";O错误:[Erno 24]打开的文件太多;。我的脚本和模块很复杂,所以我将问题分解为以下代码:
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个进程时,此代码将失败。我一直以类似的方式使用多处理,但没有遇到这个问题,我在一个CPU约为120的服务器上运行这个。最近我从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
。例如,请参见此处 - 不要产生那么多进程。如果你有120个CPU,那么产生超过120个proc是没有意义的。
- 也许使用
Pool
可能有助于重构代码
- 也许使用