簡體   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