繁体   English   中英

python 多处理打开文件过多错误

[英]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 例如看这里
  • 不要产生这么多进程。 如果你有 120 个 CPU,那么产生超过 120 个 procs 并没有什么意义。
    • 也许使用Pool可能有助于重构您的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM