繁体   English   中英

从python模块多处理和kivy锁运行进程而没有答案

[英]Running a process from python module multiprocessing and kivy locks without answer

这个简单的程序无法正确执行,在按下按钮后锁定了“阅读消息”消息。 我认为我在多处理代码中没错,因为我可以在没有奇异果的情况下运行此代码而没有任何问题,但是如果我只是从奇异果中添加相同的导入模块,则该过程将停止返回任何值。 实际上,我的测试表明该过程甚至开始运行。

我做了一个非常简单的代码来显示问题。 您可以简单地复制并运行。 当我按下按钮test时,程序立即锁定,主线程没有收到来自进程的消息。

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout


from multiprocessing import Process, Queue, Event

kv = '''
<InterfaceView>:
    Button:
        text: 'teste'
        on_press: root.do_process()
'''

def pprosess(message, q, stop):    
    q.put(message)    
    stop.wait()

Builder.load_string(kv)

class InterfaceView(BoxLayout):

    def do_process(self):
        q = Queue()
        stop = Event()

        p = Process(target=pprosess, args=('any message', q, stop))  
        p.daemon = True
        p.start()

        print('Read message')      
        print('message: ', q.get())

        stop.set()      
        p.join()

        print('Process closed')

class SimpleApp(App):
    def build(self):
        return InterfaceView()

if __name__ == '__main__':
    SimpleApp().run()  

下面的代码可以很好地执行相同的操作,而不用相信,信不信由你。 在这里您可以观察到正确的端子输出。

from multiprocessing import Process, Queue, Event

def pprosess(message, q, stop):    
    q.put(message)    
    stop.wait()

def main():
    q = Queue()
    stop = Event()

    p = Process(target=pprosess, args=('any message', q, stop))  
    p.daemon = True
    p.start()

    print('Read message')      
    print('message: ', q.get())

    stop.set()      
    p.join()

    print('Process closed')

if __name__ == '__main__':
    main()    

几天来,我为此感到非常沮丧。 拜托,有人帮我。

stop.wait()事件导致了此问题。 它等效于time.sleep()。 卸下stop应该可以解决问题。

编程指南»事件和属性»主循环

在Kivy应用程序中,必须避免长时间/无限循环或休眠。

main.py

from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout


from multiprocessing import Process, Queue, Event

kv = '''
<InterfaceView>:
    Button:
        text: 'teste'
        on_press: root.do_process()
'''


def pprosess(message, q):
    q.put(message)


Builder.load_string(kv)


class InterfaceView(BoxLayout):

    def do_process(self):
        q = Queue()

        p = Process(target=pprosess, args=('any message', q))
        p.daemon = True
        p.start()

        print('Read message')
        print('message: ', q.get())

        p.join()

        print('Process closed')


class SimpleApp(App):
    def build(self):
        return InterfaceView()


if __name__ == '__main__':
    SimpleApp().run()

输出量

图01

实际上,我的问题是Spyder开发环境和/或其某些组件。

我使用当前的IPython控制台运行代码,当我更改为在外部终端中执行时,问题已解决。

感谢@embryo特别是@ikolim的帮助。 他们的测试和建议使我想到了这个问题。

因此,如果使用Spyder开发环境 ,请注意IPython控制台 ,python多处理模块和kivy之间的不良交互作用。

我发布的所有代码均正确无误。

暂无
暂无

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

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