[Python] Thread 테스트
파이썬을 공부하기 시작했습니다~!
Thread 쪽을 보는 도중에 뭔가 이상함(?)을 느끼고 테스트를 해봤습니다.
이상한 느낌이라는게..
쓰레드를 두개로 했을때 기존보다 못해도 40% 정도는 속도면에서 이득이 있어야 하는데..
별반 다른점이 없다는점 이였습니다.
그래서~!! 테스트를 진행해봤습니다.
아주 간단한 덧셈 프로그램 인데요!
StartValue 부터 EndValue 까지 더하는 프로그램 입니다!
from threading import Thread
def do_sum(_start, _end, _result):
temp = 0
for i in range(_start, _end):
temp += i
result.append(temp)
return
StartValue = 0
EndValue = 100000000
result = list()
th1 = Thread(target=do_sum, args=(StartValue, EndValue, result))
th1.start()
th1.join()
print("Sum Result : ", sum(result))
위 프로그램을 쓰레드 1개만 사용했을 때 측정된 시간 입니다.
그리고 위의 프로그램을 쓰레드 2개로 반 씩 나누어 더해줬을 때 입니다.
from threading import Thread
def do_sum(_start, _end, _result):
temp = 0
for i in range(_start, _end):
temp += i
result.append(temp)
return
StartValue = 0
EndValue = 100000000
result = list()
th1 = Thread(target=do_sum, args=(StartValue, int(EndValue/2), result))
th2 = Thread(target=do_sum, args=(int(EndValue/2), EndValue, result))
th1.start()
th2.start()
th1.join()
th2.join()
print("Sum Result : ", sum(result))
올라..?? ....
쓰레드 1개를 사용했을 때 : 5.475s
쓰레드 2개를 사용했을 때 : 5.591s
속도가 빨라지긴 커녕 증가를 해버리네요..
원하던건 더 빨라진 속도였는데.. 쓰레드가 도움이 안되다니.. ㅠㅠ
그럼 파이썬은 쓰레드가 불가능하냐!?
그렇진 않습니다~!
파이썬에서 다중작업을 수행하려면 프로세서 개념을 사용해야 합니다.
즉, 쓰레드를 2개로 사용하는 것이 아닌 프로세서를 2개로 사용하는 개념 입니다.
from multiprocessing import Process, Queue
def do_sum(_start, _end, _result):
temp = 0
for i in range(_start, _end):
temp += i
result.put(temp)
return
StartValue = 0
EndValue = 100000000
result = Queue()
pr1 = Process(target=do_sum, args=(StartValue, int(EndValue/2), result))
pr2 = Process(target=do_sum, args=(int(EndValue/2), EndValue, result))
pr1.start()
pr2.start()
pr1.join()
pr2.join()
result.put('STOP')
temp = 0
while True:
rtnVal = result.get()
if rtnVal == 'STOP' :
break
else :
temp += rtnVal
print("Sum Result : ", temp)
사용 방법은 기존 threading 모듈을 multiprocessing 모듈로 교체해주고
Thread() 함수 대신 Process() 함수로 교체하여 사용하는 것 입니다.
그래서!? 결과는 어떤데!?
CPU 사용수치가 약 190%로 상승하고 시간은 2.867s 가 소요되었습니다!
반까진 아니지만 약 48% 정도 속도가 빨라진 것이 확인이 되네요~!
그렇다면.. 프로세서를 4개 돌리면 어떻게 될까요??
from multiprocessing import Process, Queue
def do_sum(_start, _end, _result):
temp = 0
for i in range(_start, _end):
temp += i
result.put(temp)
return
StartValue = 0
EndValue = 100000000
End1 = int(EndValue / 4)
End2 = int((EndValue / 4) * 2)
End3 = int((EndValue / 4) * 3)
End4 = int(EndValue)
result = Queue()
pr1 = Process(target=do_sum, args=(StartValue, End1, result))
pr2 = Process(target=do_sum, args=(End1, End2, result))
pr3 = Process(target=do_sum, args=(End2, End3, result))
pr4 = Process(target=do_sum, args=(End3, End4, result))
pr1.start()
pr2.start()
pr3.start()
pr4.start()
pr1.join()
pr2.join()
pr3.join()
pr4.join()
result.put('STOP')
temp = 0
while True:
rtnVal = result.get()
if rtnVal == 'STOP' :
break
else :
temp += rtnVal
print("Sum Result : ", temp)
1.5s 가 걸리네요~! 2 프로세서보다 약 48% 정도 속도가 빨라 졌습니다!
정리를 해볼까요~
쓰레드1 : 5.475 s
쓰레드2 : 5.595 s
프로세서2 : 2.867 s
프로세서4 : 1.500 s
처리속도가 걸렸습니다~
아래 동영상을 촬영했는데 촬영된 내용에는 쓰레드2가 쓰레드1 보다 처리 속도가 조금 더 빨리 나왔네요.
쓰레드1 만 계속 실행해보면 시간이 항상 일치하는 것은 아닙니다~
참고하세요^^
'Programming > Python' 카테고리의 다른 글
[Python] Qt designer으로 만들어진 ui 파일 파이썬에서 로드시키기 (0) | 2018.03.30 |
---|---|
[Python] 키움증권 OpenAPI 종목 기본정보 요청하기 (0) | 2018.03.30 |
[Python] 키움증권 OpenAPI 로그인 이벤트 연결 및 적용 (0) | 2018.03.29 |
[Python] 키움증권 OpenAPI 모듈 사용 시 동작이 안할때! (0) | 2018.03.29 |
[Python] 데이터 시각화 중 신기했던 로또번호 (0) | 2018.03.26 |
[Python] 간단한 웹페이지 읽어오기 (0) | 2018.03.22 |
[Python] 파일 오픈시 Encoding 오류 (미결) (0) | 2018.03.21 |
[Python] List 자료형 (0) | 2018.03.20 |
댓글
이 글 공유하기
다른 글
-
[Python] 데이터 시각화 중 신기했던 로또번호
[Python] 데이터 시각화 중 신기했던 로또번호
2018.03.26 -
[Python] 간단한 웹페이지 읽어오기
[Python] 간단한 웹페이지 읽어오기
2018.03.22 -
[Python] 파일 오픈시 Encoding 오류 (미결)
[Python] 파일 오픈시 Encoding 오류 (미결)
2018.03.21 -
[Python] List 자료형
[Python] List 자료형
2018.03.20