Windows 上的 Python 多处理运行时错误

Posted

技术标签:

【中文标题】Windows 上的 Python 多处理运行时错误【英文标题】:Python Multiprocessing RuntimeError on Windows 【发布时间】:2015-09-02 01:04:51 【问题描述】:

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

基本上:

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

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

if __name__ == '__main__':
    freeze_support()

This other post 也提到做同样的事情。

但是,我不知道这两行的确切位置。目前,alpha.py、beta.py 或 gamma.py 都不包含 if __name__ == '__main__': 部分。如果有人能告诉我这两行应该去哪里以及背后的理由,那就太好了。

【问题讨论】:

您能提供您收到的错误消息吗?堆栈跟踪?你解决了这个。我很惊讶没有答案。 【参考方案1】:

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

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

这很可能不是您想要的,因此当您使用 subprocess 直接运行 beta.py 时,新进程应该初始化并只启动一次。

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

【讨论】:

以上是关于Windows 上的 Python 多处理运行时错误的主要内容,如果未能解决你的问题,请参考以下文章

具有大型数组的 Windows 上的 Python 多处理

尝试python多处理的Windows上的RuntimeError

Windows 上的 python 多处理,如果 __name__ == "__main__"

Windows 上的 Python DEAP 和多处理:AttributeError

Python 多处理返回结果,记录并在 Windows 上冻结运行

多用户 Windows 服务器上的端口号处理