![](/img/trans.png)
[英]Why can't this Python multiprocessing process be terminated from 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应用程序中,必须避免长时间/无限循环或休眠。
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()
实际上,我的问题是Spyder开发环境和/或其某些组件。
我使用当前的IPython控制台运行代码,当我更改为在外部终端中执行时,问题已解决。
感谢@embryo特别是@ikolim的帮助。 他们的测试和建议使我想到了这个问题。
因此,如果使用Spyder开发环境 ,请注意IPython控制台 ,python多处理模块和kivy之间的不良交互作用。
我发布的所有代码均正确无误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.