python - Joblib Parallel 不会终止进程

标签 python memory-leaks multiprocessing joblib

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

grouped_data = Parallel(n_jobs=14)(delayed(function)(group) for group in grouped_data)
计算完成后,我可以在系统监视器中看到所有生成的进程仍然处于事件状态并且消耗内存:
enter image description here
并且所有这些进程都不会被终止,直到主进程终止导致内存泄漏。
如果我用以下方式对 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。

最佳答案

在我自己调查之后,我可以总结一下:

  • joblib.Parallel 没有义务在成功后终止进程
    单次调用
  • Loky 后端不会以物理方式终止工作人员,这是作者解释的有意设计:Loky Code Line
  • 如果你想明确释放 worker ,你可以使用我的代码片段:

  •     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()
    
  • 上面的代码不是线程/进程保存。如果你有另一个产生子进程的来源,你应该阻止它的执行。
  • 一切都适用于 joblib 版本 1.0.1
  • 关于python - Joblib Parallel 不会终止进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67495271/

    相关文章:

    python - 创建对象的副本,而不是在新的多处理进程内重新初始化

    python - 搜索字典键python

    python - 如何将字符串文件导入列表列表?

    python - 奇怪的 python 错误 3 分钟。执行推特脚本后?

    objective-c - Cocoa内存管理,为什么我的应用程序不断使用更多?

    c++ - 重新分配std::unique_ptr时是否释放内存?

    android - VM 在从缓存中获取图像时内存不足

    python - 如何将多列分组以在 pandas DataFrame 中列出

    python 多处理: write to same excel file

    python - 为什么map_async()不需要pool.close()和pool.join()?