threading 모듈은 「하나의 프로그램 안에서 여러 스레드(가벼운 실행 단위)를 동시에 돌리는」 표준 라이브러리입니다.
I/O 작업(웹 요청·파일 읽기)을 동시에 처리하면 큰 속도 향상을 얻을 수 있습니다.
기본 사용.
import threading.
def worker(n): print(f"스레드 {n}").
t = threading.Thread(target=worker, args=(1,)); t.start(); t.join().
Thread 객체에 함수와 인자를 주고 start()로 실행, join()으로 끝날 때까지 대기.
동시 실행 예시.
urls = [...]; threads = [].
for url in urls: t = threading.Thread(target=download, args=(url,)); t.start(); threads.append(t).
for t in threads: t.join().
10개 URL을 동시에 다운로드하면 순차 다운로드보다 거의 10배 빠릅니다(I/O 병목인 경우).
GIL의 한계.
파이썬에는 「GIL(Global Interpreter Lock)」이 있어 「동시에 한 스레드만 파이썬 바이트코드를 실행」할 수 있습니다.
CPU 집약 작업(예: 큰 수학 계산)은 스레드로 빨라지지 않습니다.
I/O 대기 중에는 GIL이 해제되므로 I/O 작업은 효과적으로 병렬화됩니다.
동시성 문제 — 락(Lock).
여러 스레드가 같은 데이터를 동시에 수정하면 「경합 조건(race condition)」이 발생할 수 있습니다.
lock = threading.Lock(); with lock: shared_data.append(x).
with 블록 안에서만 한 스레드가 데이터를 변경하도록 보장.
동시성 프로그래밍의 가장 큰 함정이며, 신중한 설계가 필요합니다.
한 줄 요약
threading은 한 프로세스 안의 여러 스레드를 동시 실행합니다.
I/O 작업에 효과적이지만 GIL 때문에 CPU 집약 작업은 빨라지지 않습니다.
Lock으로 경합 조건 방지가 필요합니다.
더 알아볼 것
- concurrent.futures.ThreadPoolExecutor — 더 편한 인터페이스
- GIL의 작동 원리
- async/await — 스레드의 더 가벼운 대안