2011-08-19 11 views
1

주 Pylons 프로세스의 무거운 계산을 위해 백그라운드 프로세스를 만들려고합니다. 여기에 코드입니다 :Pylons에서 호출 된 Process()가 포크를 만듭니다.

p = Process(target = instance_process, \ 
       args = (instance_tuple.instance, parent_pipe, child_pipe,)) 
    p.start() 

과정이 만들어지고 시작됩니다,하지만 주요 과정에서 포크가 될 것으로 보인다 : 동일한 포트를 듣고 전체 응용 프로그램이 끊습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

미리 감사드립니다.

답변

1

프로세스는 포크입니다. 구현을 살펴보면 Process.start()은 포크를 호출합니다. 그러나 실행 컨텍스트를 변경하려면 exec 변형 중 하나를 호출하면 안됩니다.

여전히 부모 프로세스가 멀티 스레드가 아닌 한이 포트에서 수신 대기하는 것과 관련이 없을 수 있습니다. 프로그램이 매달려있는 시점은 언제입니까? 다중 처리를 통해 생성 된 자식 프로세스를 종료하지 않고 파이썬 프로그램을 종료하려고 시도하면 자식 프로세스가 종료 될 때까지 중단됩니다. 예를 들어, 프로세스간에 파이프를 닫지 않은 경우이 오류가 발생할 수 있습니다.

+0

그렇다면 백그라운드 프로세스를 시작하는 가장 좋은 방법은 무엇입니까? 아니면 스레드를 시작하는 것이 더 좋을까요? 목표는 들어오는 명령을 기다리고 꽤 오랜 기간 동안 과중한 계산을 수행 할 수있는 사전 실행/스레드를 만드는 것입니다. –

+0

파이썬 스레딩이 퇴화되었습니다. 파이썬 인터프리터는 한 번에 하나의 실행 스레드 만 실행하여 100 개의 명령 (정확하게)마다 스레드 간을 전환하고 전체 프로세스를 인쇄합니다 (python [GIL] (http://wiki.python.org/moin/ GlobalInterpreterLock)). 나는 파이썬에서 스레딩을 권장하지 않는다. 프로세스에 관해서는, 계산이 완료된 후에'p.terminate()'와'p.join()'을 사용하면된다. – immortal

+0

이 계산은 많은 양의 데이터 (500-700 Mb)를 유발할 수 있으며, 사용자가 무언가를하고 싶을 때마다로드하는 것이 좋다. subprocess.Popen() 함수를 사용하여 프로세스를 시작하는 것은 무엇입니까? –

관련 문제