Python/2.7 information

파이썬의 멀티쓰레딩과 멀티프로세싱.

qkqhxla1 2015. 2. 13. 12:55

문제될시 댓글달아주시면 글 삭제하겠습니다.


파이썬코리아에서 공유된 링크에서 얻은 정보이다. 

http://www.slideshare.net/kthcorp/h32011c6pythonandcloud-111205023210phpapp02?from_m_app=ios

에서 정보를 얻었으며 발표자는 '하용호' 님이다. 파이썬 클라우드에 대해서 발표를 하셨었는데 중간에 읽다가 멀티쓰레딩과 멀티프로세싱을 비교하는 부분이 개인적으로 얻어가는것 같아서 가져왔다.


이건 2버전얘기고 3버전에서는 바뀌어간다고 한다 : http://mydb.tistory.com/245


여태까지 난 멀티프로세싱과 멀티쓰레딩은 거의 다른게 없다고 생각했다... 쓰레드는 프로세스의 하위개념이다. 나머지 차이는 별로 없는걸로 알고있는데 그게 아니었다..


38page에 나와 있는 계산 프로그램이다.


# -*- encoding: cp949 -*-
from threading import Thread
import time

def do_work(start, end, result):
    sum = 0
    for i in range(start,end):
        sum += i
    result.append(sum)
    return

if __name__=='__main__':
    s_time = time.time()
    START, END = 0, 20000000
    result = list()
    th1 = Thread(target=do_work, args=(START, END, result))
    #th2 = Thread(target=do_work, args=(END/2, END, result))
    th1.start()
    #th2.start()
    th1.join()
    #th2.join()
print 'Result : ',sum(result),'time =',time.time()-s_time

Result :  199999990000000 time = 3.34699988365 계산결과로 3.34초가 나왔다.

쓰레드 두개로 계산하면 더 빨라질거라는 생각에 쓰레드 두개로 하셨다고 했는데.. (주석을 풀고 코드를 알아서 고치자.)

Result :  199999990000000 time = 4.65400004387 로 쓰레드 두개를 쓰니 4.65초로 계산이 더느려졌다.


여태까지 난 당연히 쓰레드 두개를 쓰는게 더 빠를거라고 생각했는데 아니었다.

이건 GIL이라는 것 때문이며 인터프리터도 자원을 보호해야 하기 때문이라고 한다.

(아래 사진을 보면 정해진시간에 하나의 쓰레드만 일하는게 세마포어 그런것과 관련된것 같다.)



PPT에서 가져온 캡쳐인데 결국 캡쳐내용을 확인해보면 일정 시간동안 일하는건 쓰레드 하나가 분명한데, IO때문에 시간이 더 걸리는것이라고 한다. (GIL을 도입하면 인터프리터의 구현이 쉽기 때문에 이걸 도입한거라고 함.)


우리가 원하는건 멀티프로세싱으로 가능하다고 한다. 멀티프로세싱은 일반적으로 우리가 생각한 것처럼 많이 쓸수록 빨라진다


이렇다고 한다. (PPT에서 캡쳐)


# -*- encoding: cp949 -*-
from multiprocessing import Process, Queue
import time

def do_work(start, end, result):
    sum = 0
    for i in range(start,end):
        sum += i
    result.put(sum)
    return

s_time = time.time()
if __name__=='__main__':
    START, END = 0, 20000000
    result = Queue()
    pr1 = Process(target=do_work, args=(START, END/2, result))
    pr2 = Process(target=do_work, args=(END/2, END, result))
    pr1.start()
    pr2.start()
    pr1.join()
    pr2.join()
    result.put('STOP')
    sum = 0
    while True:
        tmp = result.get()
        if tmp == 'STOP' : break
        else: sum += tmp
print 'Result : ',sum,'time =',time.time()-s_time

ppt에서 가져온 위의 쓰레드 예제를 멀티프로세싱으로 변경시킨 코드이다. 실행해보면

Result :  199999990000000 time = 2.0 으로 2.0초로 줄었음을 확인할수 있다.

parallel 이란걸로 프로세스를 여러대의 컴퓨터에 쉽게 뿌려줄 수 있다고 한다.

'Python > 2.7 information' 카테고리의 다른 글

*args, **kwargs  (0) 2015.03.01
pyv8 (python javascript engine)  (0) 2015.02.24
scapy 기초.  (0) 2015.02.09
pythonpy, 리버스 커넥션 쉘(python 버전)  (0) 2015.02.09
스크린샷 찍는 pyscreenshot, 소리 재생 winsound 모듈.  (0) 2015.01.29