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文档.