Knowledge Map

쓰레드, 멀티 프로세싱 본문

PYTHON

쓰레드, 멀티 프로세싱

2016. 5. 26. 09:37

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


쓰레드 


파이썬 버전 2.7


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from threading import Thread
 
def do_work(start, end, result):
    sum = 0
    for i in range(start, end):
        sum += i
    result.append(sum)
    return
 
if __name__ == "__main__":
    START, END = 020000000
    result = list()
    th1 = Thread(target = do_work, args = (START, END/2, result))
    th2 = Thread(target = do_work, args = (END/2, END, result))
    th1.start()
    th2.start()
    th1.join()
    th2.join()
print "Result : ", sum(result)
cs




멀티 프로세싱

파이썬 버전 2.7


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from multiprocessing import Process,Queue
 
def do_work(start, end, result):
    sum = 0
    for i in range(start, end):
        sum += i
    result.put(sum)
    return
 
if __name__ == "__main__":
    START, END = 020000000
    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
cs



=====================================================================================


구글파이낸스 모듈을 이용해서 주식 정보를 가져오는 것을 하고 있는데

한국 주식 모든 번호를 가져오는 것을 잘 모르겠다. 찾아 보고 있기는 한데 아직 못찾아서 그냥 아주 무식한 방법으로 1000000 부터 999999까지 돌려보려고 했다.


하지만 하나만 돌리니까 진짜 어마무시하게 느린데다가 해놓고 좀 시간이 지나니 그냥 메모리만 잡아 먹고 있었다.

그래서 공부 삼아 스레드를 써볼까 했지만 그것도 위의 출처 주소대로 파이썬 내부의 GIL의 존재덕분에 사실상 파이썬에서는 스레드라고 하기도 어렵다.


그래서 찾아봤더니 멀티프로세싱이 있어서 그것을 적용해보니 잘 돌아간다.

시험삼아 3개의 멀티프로세싱을 돌리고 있는데 확실히 3배는 빠른거 같다 ㅋㅋㅋ


시간나면 좀더 멀티 프로세싱에 대해서 배워봐야 겠다.


(역시 예상대로 요청을 천번 넘게 하니 봇 취급 당해서 막혔다 ㅜㅡ.. 아마 그전에 막혔겠지)


===================================================



그냥 써본 예시로 남겨본다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
from multiprocessing import Process, Queue
from googlefinance import getQuotes
import json
 
def do_work(start, end, cnt):
    for i in range(start, end):
        try:
            json.dumps(getQuotes(str(i)),indent=2)
            print "\n\ni is ==>",i,"\n\n"
        except:
            print i,
            if cnt%50 == 0:
                print
            cnt += 1
            continue
 
if __name__ == "__main__":
    START, END = 190958,999999
    result = Queue()
    pr1 = Process(target = do_work, args=(START, int(END/5), 10))
    pr2 = Process(target = do_work, args=(int(END/5), int(END/5*2), 20))
    pr3 = Process(target = do_work, args=(int(END/5*2), int(END/5*3), 30))
    pr4 = Process(target = do_work, args=(int(END/5*3), int(END/5*4), 40))
    pr5 = Process(target = do_work, args=(int(END/5*4), END, 50))
    pr1.start()
    pr2.start()
    pr3.start()
    pr4.start()
    pr5.start()
    pr1.join()
    pr2.join()
    pr3.join()
    pr4.join()
    pr5.join()
cs


Comments