보통 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

드라마틱하게 속도가 빨라지지 않음..