Windows上的Python多处理RuntimeError

sla*_*law 9 python python-2.7 python-multiprocessing

我有一个类函数(让我们称之为"alpha.py"),它使用多处理(processes = 2)来分叉一个进程,并且是我编写的Python包的一部分.在一个单独的Python脚本中(我们称之为"beta.py"),我从这个类中实例化了一个对象并调用了使用多处理的相应函数.最后,所有这些都包含在一个包装Python脚本(让我们称之为"gamma.py")中,它处理许多不同的类对象和函数.

实质上:

  1. 从命令行运行./gamma.py
  2. gamma.py使用子进程并执行beta.py.
  3. beta.py从alpha.py类中实例化一个对象并调用使用多处理的函数(processes = 2)

这在Mac或Linux上运行没有问题.但是,它在Windows机器上成为一个问题,错误(和文档)表明我应该在某处写这个:

if __name__ == '__main__':
    freeze_support()
Run Code Online (Sandbox Code Playgroud)

这篇文章还提到做同样的事情.

但是,我不确切知道这两行应该驻留在哪里.目前,alpha.py,beta.py或gamma.py都不包含if __name__ == '__main__':节.如果有人能告诉我这两条线应该去哪里以及背后的理由,那将是很棒的.

wom*_*ire 4

其实freeze_support()这里不需要。您之所以会得到 ,RuntimeError是因为您在模块的顶层创建并启动了新流程beta

当在 Windows 上使用创建新进程时multiprocessing,将在该进程中启动一个新的 Python 解释器,并尝试导入具有应执行的目标函数的模块。这是你的beta模块。现在,当您导入它时,应该执行所有顶级语句,这将导致创建并再次启动新进程。然后,递归地,从该进程开始另一个进程,依此类推。

这很可能不是您想要的,因此当您直接使用subprocess.

if __name__ == '__main__':应放置在 beta.py 中,然后在本节中移动新进程的初始化和启动代码。之后,当 beta.py 被导入而不是直接运行时,不会启动新的进程,你不会看到任何副作用。