Я пытаюсь закрыть дочерний процесс (который выполняет цикл while), когда завершается родительский процесс (когда родительский процесс является чистым - выход, принудительный выход или выход из-за исключения), чтобы не сделать процесс обработки детьми процессом зомби.Выйти из цикла while, когда родительский процесс завершен?
Я делаю игру, которая общается с Arduino (используя серийный), а основной процесс запускает экземпляр ShowBase Panda3D (игровой движок, делает визуализацию и многое другое), поэтому главное не следует останавливать.
Итак, я создал подпроцесс с помощью модуля многопроцессорной так, что основной процесс является безопасным от остановки ждать последовательного ввода.
Но проблема, когда я закрыть окно Panda3D, вызовите sys.exit() или выхода из исключения, основной процесс выходит немедленно и не может присоединяться или давать ложные подпроцессы, поэтому подпроцесс становится зомби.
Я понятия не имею, как это решить. Что я должен сделать, чтобы он работал так, как я ожидал?
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from multiprocessing import Process, Queue
from panda3d.core import *
class HW_support:
def hardware_event_handler(self, process_status):
self.process_alive = True
while self.process_alive:
print('Working!')
self.process_alive = process_status.get()
return
if __name__ == '__main__':
from direct.showbase.ShowBase import ShowBase
import sys
class TestApp(ShowBase):
def __init__(self):
ShowBase.__init__(self)
self.process_status_argv = Queue()
self.HW_sub_process = Process(target = HW_support().hardware_event_handler, args=(self.process_status_argv,))
self.HW_sub_process.start()
base.messenger.toggleVerbose()
taskMgr.add(self.task_make_alive, 'task_make_alive')
base.accept('escape', self.exit_taskloop)
def exit_taskloop(self, task=None):
taskMgr.stop()
def task_make_alive(self, task=None):
self.process_status_argv.put(True)
return task.cont
app = TestApp()
app.run()
#app.HW_sub_process.join()
app.process_status_argv.put(False)
Это очень интересная идея ... я попробую прямо сейчас, спасибо! –
Обратите внимание, что в качестве блока в верхней части я думаю, что 'if __name__ ==" __main __ "' будет работать также ... Я просто хотел, чтобы было очень ясно, что цель блока if была –
Это работает! И как вы сказали, поместив его, если __name__ == «__main__» будет лучше. (ТОЛЬКО В СЛУЧАЕ) В любом случае, спасибо, брат! –