我曾使用这个答案来在Linux平台上通过多进程(multiprocessing)运行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
关键字下面发生了什么?
self.terminate()
的 源代码。 - salparadisewith
版本在pool.map()
返回后隐式地调用pool.close()
。根据文档,这可以“防止向池提交更多任务。一旦所有任务都完成,工作进程将退出”。这可能会导致每个任务打开的文件被关闭。 - martineau