gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:54:52 26 4
gpt4 key购买 nike

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

最佳答案

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

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

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

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

关于Python - Multiprocessing.processes 从可执行文件运行时成为主进程的副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7067787/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com