Эта простая программа работает некорректно, блокируя сообщение «Прочитать сообщение» после нажатия кнопки.Я думаю, что я не ошибаюсь в многопроцессорном коде, потому что я могу запустить этот код без kivy без проблем, но если я просто добавлю те же модули импорта из kivy, процесс перестанет возвращать любое значение.На самом деле мои тесты показывают, что процесс даже начинает работать.
Я сделал очень простой код, чтобы показать проблему.Вы можете просто скопировать и запустить.Когда я нажимаю кнопку 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()
Приведенный ниже код очень хорошо выполняет то же самое без kivy, поверьте мне или нет.Здесь вы можете увидеть правильный вывод терминала.
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()
Я очень расстроен, борясь с этим в течение нескольких дней.Пожалуйста, кто-нибудь, помогите мне.