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的主要内容,如果未能解决你的问题,请参考以下文章

从 nib 实例化 UIView 导致无限循环问题

Kivy 和无限线程循环 - 应用程序冻结

保存 Matlab 对象实例会导致无限循环

从nib实例化UIView会导致无限循环问题

Python Kivy:正确启动更新 GUI 元素的后台进程

如果数字大于或等于772000000000000,为什么我的python代码会产生无限循环?