multiprocessing 返回“太多打开的文件”,但使用 \`with...as\` 修复了它。为什么?

新手上路,请多包涵

我使用 这个答案 是为了在 Linux 机器上使用 Python 中的多处理运行并行命令。

我的代码做了类似的事情:

 import multiprocessing
import logging

def cycle(offset):
    # Do stuff

def run():
    for nprocess in process_per_cycle:
        logger.info("Start cycle with %d processes", nprocess)
        offsets = list(range(nprocess))
        pool = multiprocessing.Pool(nprocess)
        pool.map(cycle, offsets)

但是我收到了这个错误: OSError: [Errno 24] Too many open files

所以,代码打开了太多的文件描述符,即:它启动了太多的进程并且没有终止它们。

我修复了用这些行替换最后两行的问题:

     with multiprocessing.Pool(nprocess) as pool:
        pool.map(cycle, offsets)

但我不确切知道为什么这些线修复了它。

with 下面发生了什么?

原文由 nephewtom 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

您在循环中创建新流程,然后在完成后忘记关闭它们。结果,您有太多打开的进程。这是一个坏主意。

您可以通过使用自动调用 pool.terminate 或手动调用 pool.terminate 的上下文管理器来解决此问题。或者,为什么不只 循环外创建一个池,然后将任务发送到循环内的进程?

 pool = multiprocessing.Pool(nprocess) # initialise your pool
for nprocess in process_per_cycle:
    ...
    pool.map(cycle, offsets) # delegate work inside your loop

pool.close() # shut down the pool

有关详细信息,您可以仔细阅读 multiprocessing.Pool 文档。

原文由 cs95 发布,翻译遵循 CC BY-SA 3.0 许可协议

我已经终止并关闭了池,但文件描述符的数量有限制,我将 ulimit 更改为 40961024 并且它有效。以下是程序:

查看:

 ulimit -n

我将其更新为 4096 并且有效。

 ulimit -n 4096

原文由 devil in the detail 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题