当我退出父进程时,我试图关闭子进程(正在执行while循环)(每当父进程为clean-exit,强制退出或因异常而退出时)不要让子进程成为僵尸过程
我制作了一个与Arduino进行通信的游戏(使用序列号),主进程正在运行Panda3D的ShowBase实例(游戏引擎,渲染和其他许多东西),所以不能停止主要。
因此,我使用多处理模块创建了子进程,以便主进程可以安全地停止等待串行进入。
但问题是,当我关闭Panda3D窗口时,调用sys.exit()或因异常退出,主进程立即退出,无法连接或给予子进程错误,因此子进程变为僵尸。 / p>
我不知道如何解决这个问题。我该怎么做才能让它像我预期的那样工作?
#!/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)
答案 0 :(得分:1)
多个流程使事情变得复杂得多。
要干净地关闭HW_support进程,您需要通过Queue
对象向其发送消息,然后父进程需要join()
它(等待它退出)才能退出。< / p>
任何可能导致父出口意外退出的事情(控制台中断,抛出异常,sys.exit
等)都需要仔细捕获和管理,以便在退出之前仍然可以干净地关闭孩子。
答案 1 :(得分:1)
将其添加到顶部(远低于import multiprocessing
)
if multiprocessing.current_process().name == 'MainProcess':
import atexit
atexit.register(lambda *a : os.remove("running.txt"))
open("running.txt","wb").close()
子过程中的将您的while True
循环更改为while os.path.exists("running.txt"):
或者你可以让atexit在队列中放置一条消息,或者做任何向子进程发出信号的信息。