Python中的多进程 - pool.join()后进程未停止

3 投票
1 回答
4398 浏览
提问于 2025-04-19 19:50

我写了一段简单的代码来加速我的函数f,下面是一个使用两个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在不断重复运行这个脚本。

有什么建议吗?

1 个回答

3

你遇到关于 f0_final 的错误,是因为你没有把那行代码放在 if __name__ == "__main__": 这个保护语句里面。在Windows系统上,multiprocessing 需要在它创建的子进程中重新导入你的 __main__ 模块,这意味着你模块顶层的所有代码都会在父进程和所有子进程中执行。

这行代码

f0_final = final_f0[0:121]

是在模块的顶层定义的,所以它会在所有子进程中执行。然而,放在 if __name__ == "__main__": 保护语句下面的代码就不会执行,所以你尝试对 final_f0 进行切片的操作会失败,这样所有的子进程都会失败。这会导致你的主进程无法得到 map 调用的结果,也会阻止进程池正常关闭。

撰写回答