2014-01-10 4 views
0

저는 왜 그런지 모르지만 기본적으로 2 개의 프로세스를 실행하여 Popen 함수의 하위 프로세스를 사용합니다.Python Popen 프로세스가 의사 소통을 더 빨리 끝내지 못합니다.

commands = ['command 1', 'command 2'] 
for command in commands: 
    proc = Popen(command.split(' ')) 
    proc.communicate()  # line of interest 

명령은 렌더링 프로세스이므로 완료되면 명령이 디렉토리에 이미지를 만듭니다. 그러나 이상하게도 의사 소통()을 통해 본질적으로 시리즈를 실행하면 예상 시간 (시간 1 + 시간 2)으로 끝납니다.

그러나 실제로 그들을 병렬로 실행해야하는 communications()없이 실행하면 둘 다 더 오래 걸립니다. 왜 이런 행동이 일어나고 그것을 어떻게 해결할 수 있는지 이해할 수 있습니까?

+0

단지 2 개의 명령입니까, 아니면 실제로 더 많은 명령입니까? 이 리소스를 실행할 때 시스템 리소스는 어떻게 생깁니 까? 당신은 메모리 등으로 스왑을 치지 않을 거라 확신합니까? – mgilson

+0

예, 실제로는 2 개 (작업이 많아서 평행합니다)입니다. CPU를 최대화하지 않으며 스왑 공간을 사용하지 않습니다. 거기에 충분한 자원 이상이있는 것 같습니다. –

답변

0

병렬로 실행하려면 Popen을 여러 번 인스턴스화해야합니다. 예제에서는 stdin, stdout 또는 stderr를 통해 프로세스와 통신하지 않고 대신 파일을 통해 통신하는 것이 좋습니다. 이를 가정하면 communicate 대신 wait 메서드를 사용할 수 있습니다. 그래서 결과는 다음과 같습니다

당신의 렌더링 프로세스뿐만 아니라 파이썬으로 작성된 경우
commands = [['command', '1'], ['command', '2']] 
processes = [Popen(command) for command in commands] 
# they are both running now 
returncodes = [process.wait() for process in processes] 
# successful if all returncodes are 0 

에서, multiprocessing 모듈을 살펴 있습니다. GIL 경합을 피하면서 여러 프로세스를 사용하여 코드를 parllelize하는 데 도움이 될 수 있습니다.

실제로 프로세스와 통신하는 경우 IO 작업을 멀티플렉싱하는 더 복잡한 메커니즘을 사용해야합니다. 이것은 또한 multiprocessing 모듈이 유용 할 수있는 곳이지만 asyncore 또는 다른 IO 프레임 워크를 사용하여 통신을 구현할 수도 있습니다.

관련 문제