티스토리 뷰

01_hello_parallel

[Python] subprocess를 사용한 병렬 프로그래밍 - (1)

목표

  • 한 task의 프로세스를 복수로 실행해야하는 상황에서 병렬로 실행하여 실행시간을 단축해보자.

설정

  • subprocess를 사용해 병렬로 프로세스를 처리하는 원리를
    익히기 위해 아주 간단한 프로세스를 구현

  • argument로 숫자를 받아 n번째 프로세스인지 표시하고
    5초 대기 후, hello n subprocess를 출력하는 프로세스 구현

목표 프로세스

  • 적당한 파일에 이 코드를 작성해주세요.
'''
target_process.py
'''
import sys
import time
 
if __name__ == "__main__":
    print('{} process...'.format(sys.argv[1])) # n번째 프로세스인지 표시 
    time.sleep(5)  # 5초간 대기 
    print('Hello {} subprocess'.format(sys.argv[1]))  # 목표메시지 출력 
 

이것을 순차적으로 100번 반복실행한다고 생각했을때,
5 × 100 = 500s = 8분 20초 가 소요된다.

subprocess모듈을 사용해, 병렬로 실행해보자!

  • 위의 목표 프로세스와는 별개의 파일에 이 코드를 작성해주세요.
'''
hello_subprocess.py
'''
import time
import subprocess
 
 
def run_hello(id):
    ''' 서브프로세스 생성 후 return'''
    proc = subprocess.Popen(['python', 'target_process.py', id])
    return proc
 
start = time.time()  # 실행시간 체크 
processes = []       # 실행할 프로세스 담아놓기 
for i in range(1101):
    proc = run_hello(str(i))
    processes.append(proc)
 
# process객체의 communicate메소드로 실행 
for proc in processes:
    proc.communicate()
end = time.time()    #실행시간 체크 
 
print("Finished in %.3f seconds" % (end-start))
  • 제가 실행했을때는 6.503초가 걸립니다.
    암달의 법칙에 따르면, 프로세스 숫자가 점점 늘어날 수록, print함수의 영향을 받아 실행시간이 점차 길어질텐데요. 그럼에도 불구하고 원래 예상했던 8분 20초보다는 훨~~~~~~~~씬 빠르게 완료할 수 있겠습니다.

요약

  • 실행 프로세스 분리
  • 병렬실행할 프로세스를 일제히 담아놓고 (subprocess.Popen을 활용)
  • process.communicate() 로 비동기 실행을 통해 일제히 실행!
  • 학습하면서, 달리기할때, 일렬로 줄세울때까지 기다렸다가 모두 서면 일제히 출발해서 모두 들어올때까지 기다렸다 행사를 마무리하는 과정이 생각났습니다.


'Programming > python' 카테고리의 다른 글

PYTHON 인코딩 dictionary  (1) 2017.06.12