Joblib Parallel运行后不终止进程引发内存泄漏该如何解决?
针对joblib.Parallel loky后端进程残留、内存泄漏的解决方案
优先使用上下文管理器调用(官方推荐方案)
直接将Parallel逻辑包裹在with代码块中,退出块时会自动完成进程池的关闭、资源回收逻辑,无需额外手动操作:with Parallel(n_jobs=14) as parallel: grouped_data = parallel(delayed(function)(group) for group in grouped_data)该方法会完全复现multiprocessing.Pool手动close+join的效果,所有子进程会在计算完成后立刻被销毁,内存同步释放。
手动调用终止方法
如果场景不适合用上下文管理器,可以在计算完成后主动调用Parallel实例的回收接口:# 初始化实例 parallel = Parallel(n_jobs=14) # 执行并行计算 grouped_data = parallel(delayed(function)(group) for group in grouped_data) # 手动终止所有子进程释放资源 parallel.terminate() # 旧版本joblib如果上述调用失效可以用底层接口: # parallel._backend.terminate()如果调用
parallel.terminate()提示不存在该方法,可先升级joblib到最新稳定版:pip install -U joblib。配置空闲自动回收参数
如果你需要多次复用Parallel进程池、不想每次都重建,可以给loky后端配置空闲超时阈值,子进程空闲超过指定时长后会被自动销毁:# idle_timeout单位为秒,这里设置空闲10秒后自动回收子进程 parallel = Parallel(n_jobs=14, backend='loky', backend_kwargs={'idle_timeout': 10}) # 多次调用并行任务逻辑 # ...
补充说明:joblib默认保留子进程是为了复用进程池,降低后续并行任务的启动开销,如果你确定后续不需要再执行并行任务,用前两种方案主动回收即可。
内容的提问来源于stack exchange,提问作者Ivan Sudos
相关产品推荐
相关产品推荐

