我使用 这个答案 是为了在 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 许可协议
您在循环中创建新流程,然后在完成后忘记关闭它们。结果,您有太多打开的进程。这是一个坏主意。
您可以通过使用自动调用
pool.terminate
或手动调用pool.terminate
的上下文管理器来解决此问题。或者,为什么不只 在 循环外创建一个池,然后将任务发送到循环内的进程?有关详细信息,您可以仔细阅读
multiprocessing.Pool
文档。