我以下列方式并行运行代码:
grouped_data = Parallel(n_jobs=14)(delayed(function)(group) for group in grouped_data)
计算完成后,我可以在系统监视器中看到所有生成的进程仍然处于事件状态并且消耗内存:并且所有这些进程都不会被终止,直到主进程终止导致内存泄漏。
如果我用以下方式对 multiprocessing.Pool 做同样的事情:
pool = Pool(14)
pool.map(apply_wrapper, np.array_split(groups, 14))
pool.close()
pool.join()
然后我看到所有产生的处理最终都被终止并且没有内存泄漏。但是,我需要 joblib 并且它是 loky 后端,因为它允许序列化一些本地函数。
如何强制终止由 joblib.Parallel 产生的进程并释放内存?
我的环境如下:Python 3.8,Ubuntu Linux。
最佳答案
在我自己调查之后,我可以总结一下:
单次调用
import psutil
current_process = psutil.Process()
subproc_before = set([p.pid for p in current_process.children(recursive=True)])
grouped_data = Parallel(n_jobs=14)(delayed(function)(group) for group in grouped_data)
subproc_after = set([p.pid for p in current_process.children(recursive=True)])
for subproc in subproc_after - subproc_before:
print('Killing process with pid {}'.format(subproc))
psutil.Process(subproc).terminate()
关于python - Joblib Parallel 不会终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67495271/