退出父进程时退出while循环子进程?

时间:2016-11-03 18:27:47

标签: python python-multiprocessing pyserial panda3d

当我退出父进程时,我试图关闭子进程(正在执行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)

2 个答案:

答案 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在队列中放置一条消息,或者做任何向子进程发出信号的信息。