병렬처리
프로세스와 쓰레드
프로세스
- 하드디스크(프로그램) -> 프로세스(메모리)
- 실행중인 프로그램
- 자원과 쓰레드로 구성
쓰레드
- 프로세스 내에서 실제 작업을 수행
- 파이썬은 인터프리터 언어로서 기본적으로 싱글 쓰레드에서 순차적으로 동작
- 병렬처리를 위해선 별도의 모듈을 사용하여 수행해야 한다
멀티쓰레드
- 쥬피터 노트북이나 코랩에서 하는거보다 아나콘다 프롬포트에서 하는게 좋다
- 파이썬에서 멀티쓰레드를 쓴 것과 싱글 쓰레드로 실행시킨 것은 실행시간이 거의 차이가 없다
- 파이썬의 GIL(Global Interpreter Lock)정책 때문
import time
from threading import Thread
def work(work_id,start,end,result):
total = 0
for i in range(start,end):
total+=i
result.append(total)
if __name__=="__main__":
start = time.time()
result = []
th1 = Thread(target=work, args=(1, 0, 10000, result))
th2 = Thread(target=work, args=(2, 100001, 20000, result))
th1.start()
th2.start()
th1.join()
th2.join()
print(sum(result))
print(time.time()-start)
멀티 프로세싱(Pool)
from multiprocessing import Pool
def f(X):
return x*x
if __name__ == '__main__':
p = Pool(4)
result = p.map(f, [1,2,3,4])
p.close()
print(result)
멀티 프로새싱(Proces)
import os
from multiprocessing import Process
def f(x):
print(x*x)
print(__name__)
if __name__ == '__main__':
numbers[1,2,3,4]
proc1 = Process(target=f, args = (numbers[0],))
proc1.start()
proc2 = Process(target=f, args = (numbers[1],))
proc2.start()
proc3 = Process(target=f, args = (numbers[2],))
proc3.start()
proc4 = Process(target=f, args = (numbers[3],))
proc4.start()
proc1.join()
proc2.join()
proc3.join()
proc4.join()