몇 가지 콜백 함수가 있으며 여러 프로세스로 실행하고 부모 프로세스의 신호를 통해 종료하도록하고 싶습니다.파이썬에서 다중 프로세스를 사용하여 자식 프로세스를 올바르게 종료하는 방법
내 현재의 방법은 multiprocessing.Value
으로 공유 c_bool을 만들고이를 True
으로 설정 한 다음 작성한 모든 프로세스에 배포합니다. 그때 그들의 최종 루프 종료를 완료합니다 내 부모 프로세스 및 모든 자식 프로세스에서 False
에 부울을 전환 할 수 있습니다
while myC_bool: ...keep running...
: 내 프로세스를 모두과 같이 공유 BOOL을 사용하여 while 루프를 실행합니다.
나는 많은 사람들에게 이야기를 들었으며 다중 처리를 사용할 때 공유 메모리를 사용하지 않도록 노력해야한다는 문서를 읽었습니다. 나는 이것을 피하는 가장 좋은 방법은 프로세스를 대몬 화하고, 사용자 정의 시그널 핸들러를 제공하고, sigint/sigterm/etc를 보내라는 말을 들었습니다 ...
제 질문은 bool을 사용하여 루프를 사용하고 부모 프로세스에서 값을 변경하는 경우에만 여러 하위 프로세스에서 모든 하위 프로세스를 신속하고 안전하게 종료 할 수있는 적합한 솔루션을 읽습니다. 나는 모든 어린이들에게 공유 된 bool을 보도록하는 오버 헤드가 적어서 x 개의 수의 sigints를 그들에게 보낸다.
더 나은 해결책이 될 수 있습니까? 그렇다면 이유를 이해하는 데 도움이되고 싶습니다.
답장을 보내 주셔서 감사합니다. 사용하고있는 방법에 대한 비판에 감사드립니다. 나는 다른 프로세스에 있어도 값을보기 위해 잠금을 획득해야한다는 사실을 간과했다. 공유 된 값을 피하는 이유는 여러 프로세스를 사용하는 이점을 방해하는 프로세스가 스레드와 유사 해지기 때문입니다. – LISTERINE
@리스 스틴 : 나는 그런 식으로 생각하지 못했지만, 그래, 그것을 보는 좋은 방법입니다. 스레드에 대한 주요 단점은 공유 (변경 가능) 값이 메시지 전달보다 추론하기가 더 어렵다는 것이고 동시 프로그래밍은 인종을 고려하지 않고 충분히 어렵다는 것입니다. CPython에 특정한 단점은 GIL이 스레드 된 코드가 본질적으로과 동기화되어 병렬 대신 거의 직렬로 끝나는 것을 의미합니다. 명시 적 공유 값은 암시 적 공유만큼 나쁘지 않으며 한 값 주변의 잠금은 GIL만큼 나쁘지는 않지만 스레딩의 단점으로 돌아갑니다. – abarnert
@LISTERINE : ... 말하자면, 다음과 같은 이유로 이러한 기능이 존재한다고 언급 할 가치가 있습니다. 때로는 멀티 프로세싱으로 시작하여 스레딩으로 한 발을 내딛는 것이 (a) 스레딩에서 시작하여 멀리 이동하려는 것보다 훨씬 더 나은 대답입니다. (b) 전체 알고리즘을 다시 구성하여 공유하지 않고 코드화 할 수 있습니다. – abarnert