Joblib Parallel 不会终止进程

Joblib Parallel doesn't terminate processes

我运行代码以下列方式并行:

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()

然后我看到所有spawned processed最后都终止了,没有内存泄漏。 但是,我需要 joblib 并且它是 loky 后端,因为它允许序列化一些本地函数。

如何强制终止 joblib.Parallel 生成的进程并释放内存? 我的环境是这样的:Python 3.8, Ubuntu Linux.

我自己调查后总结的内容:

  1. joblib.Parallel没有义务在成功后终止进程 单次调用
  2. Loky 后端不会以物理方式终止 worker,这是作者有意设计的解释:Loky Code Line
  3. 如果你想明确释放工人,你可以使用我的代码片段:
    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()
  1. 以上代码未thread/process保存。如果您有另一个生成子进程的来源,您应该阻止它的执行。
  2. 所有内容都适用于 joblib 版本 1.0.1