python - Python 中的多处理 - 在 pool.join() 之后进程不会停止

标签 python multiprocessing

我写了一段简单的代码来加速我的函数 f,下面显示了一个使用 2 个 CPU 的示例:

if __name__ == '__main__':
    pool = Pool(processes = 2)   
    f0_list = pool.map(f,range(nlocs))
    pool.terminate()
    pool.join()
    final_f0 = np.sum(f0_list,axis=0)

f0_final = final_f0[0:121] # here I get the error message: 'final_f0 not defined'

我的结果“final_f0”是正确的。然而,我原以为在 pool.join() 之后,所有进程都会结束,但事实并非如此,因为:

  1. 我仍然有一个 CPU 在后台运行,即使 final_f0 已有效返回,它似乎也没有停止?
  2. 当我尝试如上所述剪切“final_f0”时,收到此错误消息。错误消息打印了很多次,就好像 Python 一遍又一遍地运行脚本一样。

有什么建议吗?

最佳答案

您收到有关 f0_final 的错误,因为您没有将该行保留在 if __name__ == "__main__": 守卫中。在 Windows 上,multiprocessing 需要在它生成的子进程中重新导入您的 __main__ 模块,这意味着模块顶层的所有内容都将在父进程中执行处理它的所有 child 。

线

f0_final = final_f0[0:121]

是在模块的顶层定义的,因此它会在您的所有子进程中执行,但是 if __name__ == "__main__": 守卫下的代码不会,所以您的尝试获取 final_f0 的一部分将失败,这意味着所有子进程都将失败。这将使您的主进程无法获得 map 回调的结果,并防止池被正确关闭。

关于python - Python 中的多处理 - 在 pool.join() 之后进程不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666905/

相关文章:

python - 列表中可变大小的 block 的总和,其中其他列表给出了大小

python - 当卡住为可执行文件时,多处理运行主窗口的新实例

python - multiprocessing.Process 在哪里

python - 将元组分配给 pandas 中的单元格

python 如何在每次循环迭代时生成新的随机数?

Windows 上的 Python 2.7,所有多处理示例的 "assert main_name not in sys.modules, main_name"

python - Python 中使用多线程/多处理对矩阵元素求和

python - 多处理另一个函数的函数

python - 使用 OpenCV detectMultiScale 找我的脸

python - 使用 Python 和 Coverage 构建 Hudson 失败