본문 바로가기
Development/Python

Python subprocess와 Multi-process

by 곽동현 이스텔리앙 2020. 2. 20.

System Command

python에서 command line으로 명령을 내리는 방법은 os.system()을 이용하는 방법과, subprocess를 이용하는 방법 두가지가 있다. 그러나 여러가지 이유로 os.system()보다는 subprocess를 이용하는 것이 훨씬 더 많은 기능을 제공하고, 더 권장되는 방법이다.







Python에서 Subprocess 사용하기

subprocess 명령어는 윈도우에서 커맨드라인 명령어를 System() 함수로 호출 하듯, 리눅스의 OS명령어를 파이썬에서 실행시키는 기능이다.


from subprocess import Popen, PIPE

    

proc = Popen(["python", "--version"], stdout=PIPE, stderr=PIPE)

(stdout, _) = proc.communicate()

print(stdout, _)




Subprocess

Subprocess.Popen은 os에게 fork로 새로운 process를 시키도록 명령을 내리는 것이고, 아래 나오는 multiprocess는 python 의 프로세스 내에서 분기하는 것이다.

## Minimal subprocess 예시

task = subprocess.Popen(["cat", "abc.txt"], cwd='/home/imcomking/TTT/', stdout=subprocess.PIPE, stderr=subprocess.PIPE)


for line in task.stdout:

    print(line)



Multi-process

Python Thread와 Multiprocess

python에서는 GIL(Global Interpreter lock)으로 인해 thread가 1개 밖에 동시에 실행이 안된다. 즉 진정한 의미의 thread가 아니다.

http://highthroughput.org/wp/cb-1136/ 


## 사용법:

from multiprocessing import Process, Queue

queue = Queue()

p = Process(target = my_function) #, args=(queue, 1))

p.start()

# p.join() # this blocks until the process terminates

# result = queue.get()

https://stackoverflow.com/questions/2046603/is-it-possible-to-run-function-in-a-subprocess-without-threading-or-writing-a-se


## 따라서 python에서는 일반적으로 thread 대신 multiprocessing을 사용한다

그런데 multiprocessing을 사용하게 되면 shared memory를 사용하기 힘들다는 단점이 존재한다. 


그래서 이를 해결하기 위해 pickle/unpickle 등의 트릭을 이용해서 SHM을 사용하기도 하는데, 이는 공유할 데이터가 커지면 속도가 매우 느려지는 단점이 존재한다.


## 그대신 python에서 제공하는 sharedctypes를 사용하거나, multiprocessing.Value 나 Array를 사용하는 방법이 존재한다.


http://thousandfold.net/cz/2014/05/01/sharing-numpy-arrays-between-processes-using-multiprocessing-and-ctypes/


https://stackoverflow.com/questions/10721915/shared-memory-objects-in-multiprocessing/10724332


## 또는 각 process를 생성할 때, args로 공유할 데이터를 전달하는 방식도 존재한다. (이 방법이 가장 손쉬운 방법. 대신 공유할 메모리가 크면 문제가 생김)




Multi-process Graceful Termination

https://cuyu.github.io/python/2016/08/15/Terminate-multiprocess-in-Python-correctly-and-gracefully





'Development > Python' 카테고리의 다른 글

CSV파일 인코딩(Encoding)  (0) 2020.03.23
Python 설치 및 삭제하기  (0) 2020.02.27
Python subprocess와 Multi-process  (0) 2020.02.20
Python에서 directory 관련 명령어  (0) 2020.02.19
Python 코드 안에서 git과 pip 사용하기  (0) 2020.02.19
Advanced Python Scheduler  (0) 2020.02.18

댓글0