2016-11-03 21 views
0

親プロセスが終了したときに子プロセス(ループ中)を終了しようとしています。子プロセスをゾンビプロセスにしないために、親プロセスがクリーン終了、強制終了、または例外のために終了するたびに終了します。親プロセスが終了したときにwhile-looped子プロセスを終了しますか?

(シリアルを使用して)Arduinoと通信するゲームを作成しています。メインプロセスはPanda3DのShowBaseインスタンス(ゲームエンジン、レンダリングなど)を実行していますので、メインを停止しないでください。 、
だから、私は。シリアル待つために停止からメインプロセスが安全であるように、マルチプロセッシングモジュールを使用して

をサブプロセスを作成しましたが、私はPanda3Dウィンドウを閉じる際の問題は、sys.exitを呼び出している()または例外のため終了しましたメインプロセスは即座に終了し、サブプロセスに参加することもfalseにすることもできないため、サブプロセスはゾンビになります。

これを解決する方法はわかりません。私は期待どおりに動作させるために何をすべきですか?

#!/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) 

答えて

1

代わりにあなたがatexitを場所に、キュー内のメッセージを持っているか、可能性がwhile os.path.exists("running.txt"):

にごwhile Trueループを変更subproccesで

if multiprocessing.current_process().name == 'MainProcess': 
    import atexit 
    atexit.register(lambda *a : os.remove("running.txt")) 
    open("running.txt","wb").close() 

(よくimport multiprocessing以下)先頭にこれを追加終了すべきサブプロセスに信号を送るために何でもしてください。

+0

これはとても興味深いアイデアです...今すぐ試してみましょう、ありがとう! –

+1

トップにあるブロックとして、 'if __name__ ==" __main __ "'もうまくいくと思います...私はちょうどそれがifブロックの目的が何であるかを非常に明確にしたいと思っていました –

+0

これは機能します!そして、あなたが言ったように、もしそれが__name__ == "__main__"ならばそれを置くのが良いでしょう。(ちょっとした事件のため)とにかく、ありがとう! –

1

複数のプロセスにより、作業がかなり複雑になります。

HW_supportプロセスを正常にシャットダウンするには、Queueオブジェクトを使用してメッセージを送信する必要があります。その後、親はjoin()(終了するまで待ってから)終了する必要があります。

コンソール終了、予期せぬ例外(スロー例外、sys.exitなど)を予期せずに終了させる可能性のあるものはすべて、慎重にキャッチして管理する必要があります。メインプログラムで

+0

Umm ...メインプロセスが生きているかどうかを調べるサブプロセスに関数を追加するのは良い考えですか?それが死んでいる場合は、終了します。私はマルチプロセッシングを使わないことも考えていますが、どちらも分かりません:-P –

+2

もう一つの答えは、その目的のためにファイルを使うことを提案しています。古い質問(http://stackoverflow.com/questions/25542110/kill-child-process-if-parent-is-killed-in-python)には、子供を 'デーモンモード'に設定するなど、いくつかのヒントがあります。親が殺されたときに殺される。 –

+0

ああ、その方法は実験の価値があります。私は後でその方法を試してみましょう。ファイルを使用するソリューションは素晴らしい作品です:-)とにかく、ありがとう! –

関連する問題