python-进程中的无限循环导致kivy实例产生forverer
Posted
技术标签:
【中文标题】python-进程中的无限循环导致kivy实例产生forverer【英文标题】:python- infinite loop in a process causes kivy instances to spawn forverer 【发布时间】:2020-08-29 10:39:18 【问题描述】:我有一个 kivy 应用程序,它使用多处理来生成具有无限循环的进程。
代码在 ubuntu 上运行良好——因为 linux 使用分叉作为默认值——。问题在于,在 Windows 操作系统中,生成是默认设置,因此每次迭代时,进程都会从头开始遍历代码,创建无限的 kivy GUI 实例。
我该如何解决这个问题?这就是我开始我的过程的方式:
def f(x):
while True:
print(x)
if __name__ == '__main__':
p = Process(target=f, args=('bob',))
p.start()
注意:我不使用 p.join() 因为函数永远不会结束。
【问题讨论】:
问题1:你的缩进是否正确?问题 2:您作为代码发布的内容不会产生无限实例......您可以放置更多代码以便其可复制吗? 你的问题和解决方法和this一样吗? @DarrylG 非常感谢你;解决方案是按照您对主模块的建议添加 multiprocessing.freeze_support() ,添加答案以便我接受。 @JasonChia 抱歉,我把它简化了。我编辑了主要问题。 @MohammedBaashar——很高兴它成功了。我采纳了您的建议并将其添加为答案,以便其他人将来更容易找到解决方案。 【参考方案1】:如果只是添加 freeze_support 失败,您需要在 if name == main guard 下导入 kivy 之前导入多处理和冻结支持。
更多细节在这里: https://github.com/kivy/kivy/issues/4744
【讨论】:
【参考方案2】:问题由this kivy issue log解决
总结
windows(不是Linux)上的问题,当使用multiprocessing.Manager时,kivy会重复创建一个新窗口
解决方案
[添加冻结支持] (https://docs.python.org/2/library/multiprocessing.html#multiprocessing.freeze_support) 在开始多重处理之前
示例
if __name__ == '__main__':
freeze_support()
Process(target=f).start()
附加背景
Python multiprocessing is different under Linux and Windows 由 Mohammed Baasha 推荐(参见 cmets)
【讨论】:
我应该再次注意并强调在 linux 上使用“forking”和在 windows 上使用“spawning”:rhodesmill.org/brandon/2010/…以上是关于python-进程中的无限循环导致kivy实例产生forverer的主要内容,如果未能解决你的问题,请参考以下文章