加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

Windows上的Python多处理RuntimeError

发布时间:2020-12-14 04:14:07 所属栏目:Windows 来源:网络整理
导读:我有一个类函数(让我们称之为“alpha.py”),它使用多处理(processes = 2)来分叉一个进程,并且是我编写的 Python包的一部分.在一个单独的Python脚本中(我们称之为“beta.py”),我从这个类中实例化了一个对象并调用了使用多处理的相应函数.最后,所有这些都包含
我有一个类函数(让我们称之为“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__’:部分.如果有人可以告诉我这两行应该去哪里以及它背后的基本原理,那将是很棒的.

实际上,这里不需要freeze_support().您会收到RuntimeError,因为您在beta模块的顶层创建并启动了新流程.

当在Windows上使用多处理创建新进程时,将在此进程中启动新的Python解释器,并尝试使用应执行的目标函数导入模块.这是您的测试版模块.现在,当您导入它时,应执行所有顶级语句,这将导致创建并重新启动新进程.然后,递归地,来自该过程的另一个过程,依此类推.

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

if __name__ ==’__ main__’:应该放在beta.py中,然后在本节中移动初始化并启动新进程的代码.之后,当导入beta.py并且不直接运行时,将不会启动任何新进程,您将看不到任何副作用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读