2013-09-25 3 views
0

많은 양의 데이터를 씹는 작은 파이프 라인을 만들고 있습니다. 파이썬을 사용하여 여러 코어를 사용하여 프로그램을 호출하기로 결정했습니다.서브 프로세스와 다중 프로세스 모듈 결합하기

1) 프로그램은 매우 큰 텍스트 파일을 출력합니다

그래서 여기 내 질문입니다. 출력을 새 파일에 저장하기 만하면됩니다 (파이썬 객체로 문자열을 저장하지 않음). 서브 프로세스 모듈을 사용하여이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

2) 다중 프로세스 모듈을 사용하여 여러 번 병렬로 프로그램을 호출하고 싶습니다. 나는 보통 간단한 방법으로 가서 Pool.map 함수를 사용한다. 이것이 서브 프로세스 모듈을 방해 할까?

미리 감사드립니다.

답변

2

1) 프로그램에서 매우 큰 텍스트 파일을 출력합니다. 출력을 새 파일에 저장하기 만하면됩니다 (파이썬 객체로 문자열을 저장하지 않음). 서브 프로세스 모듈을 사용하여이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 당신이 the documentation 보면, stdout에 대한 유효한 값은

있습니다

PIPE, 기존의 파일 기술자 (양의 정수), 기존 파일 객체 및 없음. 그래서

:

with open('new_file.txt', 'w') as outfile: 
    subprocess.call(['program', 'arg'], stdout=outfile) 

2) 나는 멀티 프로세스 모듈을 사용하여 병렬 프로그램을 여러 번 전화를하고 싶습니다. 나는 보통 간단한 방법으로 가서 Pool.map 함수를 사용한다. 이것이 서브 프로세스 모듈을 방해 할까?

이상한 일을하지 않는 한.

multiprocessing.Pool은 생성 된 프로세스를 추적하며, 다른 곳에서 생성되는 다른 하위 프로세스를 관리하지 않으므로 걱정되는 명백한 문제는 문제가되지 않습니다.

내가 보아온 가장 일반적인 문제는 Popen을 사용하여 절대로 얻을 수없는 하위 프로세스를 만드는 것입니다. multiprocessing없이 앱에서이 문제를 해결할 수 있지만 풀 작업에서 Popen 및 누출을 마자 마자 그만 떠나지 않습니다. (이것은 실제로 multiprocessing 또는 Python과 관련이 없으며, 단지 손자 프로세스가 하위 프로세스와 동일하지 않습니다.)

+0

답변 해 주셔서 감사합니다. 'open with '을 사용하는 특별한 이유가 있습니까? – Misconstruction

+0

@ 잘못된 구성 :'open'을 사용할 때'항상'withally를 사용해야합니다. 그렇지 않다면 예외 나 조기 반환 등 무엇이든 관계없이'outfile.close()'가 무엇이든 상관없이 호출되도록 다른 방법이 필요하다. (특히 쓰기 가능한 파일의 경우 파일을 닫지 않으면 마지막 몇 줄이 디스크에 저장되지 않을 수도 있습니다.)이 특별한 경우에는 ... 실제로 위험은 없지만 여기서도 몇 번의 키 스트로크를 절약 할 수 있습니다. 위험성이 있는지에 대해 생각 해봐야합니다. – abarnert

관련 문제