多处理返回"太多打开的文件",但使用`with ... as`修复它.为什么?

nep*_*tom 15 python multiprocessing with-statement process-pool

我正在使用这个答案,以便在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)
Run Code Online (Sandbox Code Playgroud)

但是我得到了这个错误:OSError: [Errno 24] Too many open files
所以,代码打开了太多文件描述符,即:它启动了太多进程而没有终止它们.

我修了它用这些线代替最后两行:

    with multiprocessing.Pool(nprocess) as pool:
        pool.map(cycle, offsets)
Run Code Online (Sandbox Code Playgroud)

但我不知道为什么这些线路修复了它.

在那下面发生了with什么?

cs9*_*s95 15

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

您可以通过使用自动调用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
Run Code Online (Sandbox Code Playgroud)

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