繁体   English   中英

Python - 从可执行文件运行时,Multiprocessing.processes 成为主进程的副本

[英]Python - Multiprocessing.processes become copies of the main process when run from executable

我刚刚在我的程序中发现了一个奇怪的错误,它与它使用 Python 的多处理模块有关。 当我从机器上的源代码运行程序时,一切正常。 但是我一直在使用 pyinstaller 将其构建为可执行文件,并且由于某种原因,当我运行从我的代码构建的可执行文件时,多处理的行为发生了巨大变化。 具体来说,当我尝试运行我的代码的多处理部分时,而不是做它应该做的事情,似乎是我的程序主 window 的副本弹出,每个进程一个。 更糟糕的是,如果手动关闭它们,它们会重新打开,大概是因为它们是 multiprocessing.pool 的一部分。 不会打印任何错误消息,并且一旦创建了所有 windows 就坐在那里什么都不做。 可能会发生什么导致这种情况?

在 Windows 上, multiprocessing尝试通过启动可执行文件的新实例来模拟 Unix fork()系统调用,并在其中执行其子进程例程( multiprocessing.forking.main() )。 使用标准的 Python 解释器( python.exe ), multiprocessing可以传递-c参数来运行自定义代码。 但是,对于自定义可执行文件,这是不可能的,因为可执行文件很可能不支持与python.exe相同的命令行选项。

freeze_support() function 通过显式执行子进程例程来回避这个问题,并通过调用sys.exit()终止解释器。 如果您忘记调用freeze_support() ,则新进程不知道它是子进程并运行主应用程序逻辑。 在您的情况下,这将弹出另一个主 GUI window。

由于从新创建的进程启动另一个子进程将导致无限递归, multiprocessing尝试通过检查sys.frozen属性来防止这种情况,如果未调用freeze_support()则引发RuntimeError 在您的情况下,似乎需要用户交互来产生进程,因此没有无限递归也没有RuntimeError

按照惯例, sys.frozen仅设置为由py2exe或 PyInstaller 创建的自动生成的可执行文件。 当想要将 Python 嵌入到应支持 windows 下的多处理的自定义可执行文件中时,了解此逻辑并将sys.frozen设置为True非常重要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM