2016-11-03 7 views
0

부모 프로세스가 종료 될 때 자식 프로세스 (루프가 실행되는 동안)를 닫으려고합니다. 자식 프로세스를 좀비 프로세스로 만들지 않으려면 (부모 프로세스가 클린 - 종료, 강제 종료 또는 예외로 인해 종료 될 때마다)부모 프로세스가 종료 될 때 While 루프 된 자식 프로세스를 종료 하시겠습니까?

저는 Arduino (직렬 사용)와 통신하는 게임을 만들고 있고, 주 프로세스는 Panda3D의 ShowBase 인스턴스 (게임 엔진, 렌더링 및 다른 많은 작업)를 실행하므로 주를 중지하면 안됩니다. ,
그래서, 나는. 시리얼 기다려야 정지에서 주요 프로세스가 안전하도록 멀티 모듈을 사용하여

을 하위 프로세스를 생성하지만 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) 

답변

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__"에 넣으면 더 좋을 것입니다. (JUST IN CASE) 어쨌든, 고마워요! –

1

여러 프로세스를 사용하면 작업이 훨씬 복잡해집니다.

HW_support 프로세스를 정상적으로 종료하려면 Queue 개체를 통해 메시지를 보내야합니다. 그런 다음 부모가 자신을 종료하기 전에 join() (종료 될 때까지 기다려야 함) 필요가 있습니다.

부모가 예기치 않게 종료 될 수있는 모든 항목 (콘솔 인터럽트, 예외 발생, sys.exit 등)은 조심스럽게 잡아 관리해야 종료하기 전에 아이를 완전히 종료 할 수 있습니다. 메인 프로그램에서

+0

음 ... 그렇다면 주 프로세스가 살아 있는지 조사하는 하위 프로세스에 함수를 추가하는 것이 좋습니다. 죽은 경우 자체를 종료 하시겠습니까? 나는 또한 멀티 프로세싱을 사용하지 않을 것을 고려하고있다. 그러나 나는 전혀 모른다 : -P –

+2

또 다른 대답은 그 목적을 위해 파일을 사용할 것을 제안한다. 이전 질문 (http://stackoverflow.com/questions/25542110/kill-child-process-if-parent-is-killed-in-python)에는 'daemon mode'로 설정하는 것을 포함하여 몇 가지 유용한 팁이 있습니다. 부모가 죽을 때 살해되게하십시오. –

+0

아, 그런 식으로 실험의 가치가 있습니다. 그 방법은 나중에 시도해 보겠습니다. 파일을 사용하는 솔루션은 훌륭하게 작동하지만 :-) 어쨌든, 답변 해 주셔서 감사합니다! –