2017-03-04 2 views
1

다른 장치와의 더 빠른 통신을 처리하기 위해 Ubuntu의 Python 3.6에서 다중 처리를 사용하고 있습니다.Python Multiprocessing : 상위 프로세스가 종료 될 때 데몬 프로세스를 종료하는 더 나은 구현은 무엇입니까?

부모 프로세스가 완료되면 하위 프로세스를 종료하도록 daemon = True을 설정했습니다. 그러나 주 프로세스가 종료되면 다른 프로세스 (다음 코드의 _another_process)가 종료되지 않고 계속 살아있을 수 있습니다. 그런 다음 동일한 프로그램을 다시 실행하면 위의 코드를 실행할 때 address already in use 오류가 발생합니다. 물론, 나는이 과정을 죽일 수 있지만 성가시다. 나는 해결하고 싶다.

Class Xxx 
def __init__(self): 
     self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
     self.sock.settimeout(2.5) 
     self.sock.bind((self.ip, self.port)) 
     self.sock.settimeout(None)  
     self.start_process() 
     time.sleep(1.5) 

    def start_process(self):  
     p = mp.Process(target=self._another_process) 
     time.sleep(1) 
     p.daemon = True 
     p.start() 

    def _another_process(self): 
     while True: 
      # Do continuous (infinite) operation 

가끔 종료 이유를 알고 때로는 아니지만, 내가 원하는 것을 실현하기 위해 더 나은 구현이있다하지? 또는 daemon = True이 가장 좋습니다.

내 자식 프로세스가 무한대로 작동하기 때문에 join()을 사용하지 않아야한다고 생각합니다. 그러나 오해하는 경우 알려 주시기 바랍니다. 주의 소멸자에서 python3 워드 프로세서, process.terminate()에서

+0

감사합니다. 이미 두 가지 해결책이 있지만 어느 것이 더 나은지 잘 모릅니다. SO_REUSEADDR을 사용해도 안전합니까? 주 소멸자가 프로세스를 종료 할 때마다 호출됩니까? – kangaroo

답변

2

: 이것은 SIGTERM을 보내드립니다

p.start() print(p, p.is_alive()) p.terminate()

는 자식 프로세스에 의해 처리된다. 또는 SIGKILL을 보내려면 p.kill()을 사용하십시오. 응용 프로그램에서 SIGTERM을 처리하는 방법에 대한 https://docs.python.org/3/library/multiprocessing.html

에서

전체 예 : How to process SIGTERM signal gracefully?

+0

감사합니다. 나는 이것을 사용할 것이다. 이것을 사용하기위한 단점이나 잠재적 인 문제점이 있습니까? – kangaroo

+0

자 이제는 자식 프로세스가 강제 종료되지 않고 유닉스 시그널 SIGTERM을 보내거나, 자식 프로세스에 의해 어떤 방식 으로든 캐치, 무시 또는 처리 될 수 있음을 알아야합니다. –

+0

소멸자를 만들고 (나는'self.process'에'p '를 대체한다.) terminate()를 실행하지만 여전히 실행 중이다. 'print (self.process, self.process.is_alive())'의 결과는'>' – kangaroo

0

는 "이미 사용중인 주소"를 해결하려면 문제는 SO_REUSEADDR 소켓 옵션을 추가하려고합니다.