2014-02-09 12 views
7

을 처리합니다파이썬 멀티와 자녀의 독립, 나는 다음과 같은 몇 가지 명령을 실행 장기 실행 자식 프로세스 산란 파이썬 터미널에서

from multiprocessing.process import Process 
Process(target=LONG_RUNNING_FUNCTION).start() 

이 명령의 반환을, 나는 다른 일을 할 수있다 파이썬 터미널이지만, 자식이 인쇄 한 내용은 여전히 ​​파이썬 터미널 세션에 인쇄됩니다.

때 나는 그것을 중단 exit 명령 (중 exit 또는 CTRL + D로) 터미널을 종료합니다. 이 중단 동안 CTRL + C을 누르면 하위 프로세스가 종료됩니다.

(posix kill 명령을 사용하여) 파이썬 터미널 프로세스를 수동으로 종료하면 하위 프로세스가 고아가 아닌 대신 출력이 계속 무시되어 실행됩니다. 내가 python -c이 코드를 실행하면

, 아이가 종료하는 것은 대기 및 CTRL + C는 부모와 자식 모두를 죽인다.

부모가 종료되면 자식을 죽이는 python 구성을 실행하는 것은 어느 것입니까? 특히, python-mod_wsgi-apache 웹 서버가 자식 프로세스를 생성 한 다음 다시 시작하면 자식이 죽었습니까?

[제쳐두고, 터미널에서 생성 된 하위 프로세스를 분리하는 올바른 방법은 무엇입니까? 방법이 더 우아한 다음과 같은 이상이 있습니까 : Deliberately make an orphan process in python]

업데이트 : 아파치에서 실행중인 웹 서버에 의해 multiprocessing.Process와 양산 파이썬 서브 프로세스는 아파치를 다시 시작할 때 살해하지 있습니다.

답변

12

이것은 파이썬을 호출하는 방법과 관련이 없습니다. 이는 multiprocessing 모듈의 기능입니다. 해당 모듈을 가져올 때 부모가 종료되도록 허용하기 전에 multiprocessing.Process을 통해 생성 된 모든 하위 개체의 Process 개체에서 join()을 호출하는 부모 프로세스에 종료 처리기가 추가됩니다. 이러한 방식으로 하위 프로세스를 시작하려는 경우 모듈 내부를 해킹하지 않아도 문제를 일으키는 동작을 피할 방법이 없습니다.

부모보다 오래 살 수있는 프로세스를 시작하려면 subprocess.Popen을 사용하는 것이 더 나을 것입니다.

>>> from subprocess import Popen 
>>> Popen(["sleep", "100"]) 
<subprocess.Popen object at 0x10d3fedd0> 
>>> exit() 
alp:~ $ ps -opid,ppid,command | grep sleep | grep -v grep 
37979  1 sleep 100 

당신이 multiprocessing 대신 subprocess를 사용하는 특별한 이유가 : 아이가의 그런 식으로 시작하는 경우, 부모는 고아 아이를 떠나, 종료하기 전에 아이를 결합하려고 시도하지 않습니다 대신 즉시 종료됩니다 ? 전자는 부모보다 오래 남아있는 자식 프로세스를 만드는 데 사용되지 않습니다. Global Interpreter Lock을 우회하는 방법으로 CPU를 통해 효과적으로 병렬 처리 될 수있는 작업을 수행하기위한 자식 프로세스를 만드는 것입니다. (이 토론의 목적으로 multiprocessing의 배포 기능을 무시합니다.) 따라서 GIL이 없으면 스레드를 사용하는 경우에는 multiprocessing이 일반적으로 사용됩니다. (이와 관련하여 multiprocessing 모듈의 API는 threading 모듈의 API를 기반으로합니다.)

게시물 끝에있는 특정 질문은 다음과 같습니다. (1) 부모가 종료 될 때 어린이를 죽이는 것은 python에 대한 책임이 없습니다. 웹 서버의 자식은 부모가 종료 전에 (또는 전체 프로세스 그룹이 죽은 경우에만) 죽이는 경우에만 종료됩니다. (2) 당신이 링크하는 방법은 그렇게하기위한 표준 관용구에 대한 지식 없이도 데몬 화를 복제하려고하는 것처럼 보입니다. 데몬 프로세스를 생성하기위한 많은 패키지가 있습니다. 대신 그들 중 하나를 사용해야합니다.

+0

서브 프로세스는 시스템 호출을 디스패치하기위한 모듈로, 서브 프로세스를 사용하여 백그라운드 파이썬 태스크를 시작하는 것은 부적절한 것으로 보입니다. 좋은 python-deamon 라이브러리 (예 : python-deamon)를 사용 했습니까? – Zags

+1

배경/전경 구분은 쉘의 작업 제어에만 적용됩니다. 일반적으로 프로세스 관리에 적용되는 용어를 사용하는 것은 이치에 맞지 않습니다. 좀 더 일반적인 맥락에서, 데몬 화는 프로세스가 스스로 수행하는 것으로,'subprocess.Popen '을 사용하여 그러한 프로세스를 시작하는 것은 전적으로 표준입니다. 'python-daemon'은 괜찮습니다; 그것은 성가신 API를 가지고 있지만, 전투 테스트를 거쳤으며, 후자의 품질은 중요합니다. 이런 종류의 일을 잘못하기 쉽기 때문입니다. – Alp