병렬 처리 - threading
보통 socket 통신을 이용하여 통신하는 경우 병렬처리로 많이 사용함
Thread
스레드란 프로세스 내부에 있는 CPU 수행 단위
즉, 프로세스는 운영체제로부터 자원을 할당아 실행되는 작업(어플리케이션)의 단위.
- 크롬 브라우저를 두개 실행하면 두개의 프로세스가 실행
- 그 프로세스 안에서 유투브를 볼 수 있고 광고 배너가 뜰 수 있고, 검색어를 입력 받을 수도 있음..
- 이 각각의 일들을 thread라고 함
스레드는 사전적 의미로 한 가닥의 실이란 의미로
한 프로세스 내에 스레드가 두 개라면 코드가 실행되는 흐름이 두 개생긴다는 의미
Threading
threading
은 스레드를 이용하여 한 프로세스에서 2가지 이상의 일을 동시에 실행할 수 있게 하는 표준 모듈
파이썬은 기본적으로 싱글 스레드에서 순차적으로 동작함
- 병렬 처리를 위해서는 별도 작업이 필요함
- 활용 분야
- 대용량 데이터의 처리시간을 줄이기 위해 데이터를 분할하여 병렬로 처리
- 애플리케이션에서 다중 네트워크 통신을 할 때
- 여러 클라이언트의 요청을 동시에 처리하는 서버를 개발할 때
Threading Python 예시
from threading import Thread
import time
threading 을 사용하지 않을 경우
# 0부터 10,000,000 까지의 합을 구하는 프로그램
def work(id, start, end, result):
total = 0
for i in range(start, end):
total += i
result.append(total)
return
if __name__ == "__main__":
start = time.time()
START, END = 0, 10000000
result = list()
th1 = Thread(target=work, args=(1, START, END, result)) # 싱글 스레드
th1.start()
th1.join()
th1_elapsed = round(time.time() - start, 2)
print(th1_elapsed, ' 초 경과')
print(f"합계 결과: {sum(result)}")
3.13 초 경과
합계 결과: 49999995000000
threading 을 사용할 경우
if __name__ == "__main__":
start = time.time()
START, END = 0, 10000000
result = list()
th2 = Thread(target=work, args=(2, START, END, result)) # 멀티 스레드
th2.start()
th2.join()
th2_elapsed = round(time.time() - start, 2)
speed_up = round(th1_elapsed/th2_elapsed, 1)
print(th2_elapsed, ' 초 경과')
print(speed_up, ' 배 속도 향상')
print(f"합계 결과: {sum(result)}")
2.52 초 경과
1.2 배 속도 향상
합계 결과: 49999995000000
드라마틱하게 속도가 빨라지지 않음..