我使用this answer为了在Linux机器上运行Python中的多处理并行命令。多处理返回“太多打开的文件”,但使用`with ... as`修复它。为什么?
我的代码不喜欢的东西:
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
下面发生了什么?
这里是[源代码](https://github.com/python/cpython/blob/master/Lib/multiprocessing/pool.py#L607-L611)每个进程都调用'self.terminate()' – salparadise
'with'版本在'pool.map()'返回后隐式调用'pool.close()'。根据文档,“阻止任何更多任务被提交到池中,一旦所有任务完成,工作进程将退出”。这可能会导致每个任务打开的文件被关闭。 – martineau
我错了,还是@COLDSPEED确实回答了问题,现在它已被删除?我无法深入阅读,但我想...但现在它已经消失......任何人都知道为什么这个问题被低估了? – nephewtom