본문으로 바로가기

[Python] Thread 테스트

category Programming/Python 2018.03.20 15:15




파이썬을 공부하기 시작했습니다~!


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 만 계속 실행해보면 시간이 항상 일치하는 것은 아닙니다~


참고하세요^^



 


댓글을 달아 주세요