GIL — 뭐고 왜 중요
CPython 에 Global Interpreter Lock — 한 번에 한 스레드만 Python 바이트코드 실행 허용하는 mutex. CPU 바운드 두 스레드가 Python 병렬 실행 X — 차례로 함. GIL 이 I/O 동안 release 되니 threading 이 I/O 무거운 작업엔 여전히 유용. CPU 무거운 작업엔 multiprocessing (다음 lesson) 또는 3.13+ 의 새 free-threaded 모드 (실험).
threading 사용 시기
(1) 동시 I/O 필요한데 third-party 라이브러리가 async 지원 X (sync DB 드라이버, sync HTTP 클라이언트). (2) blocking 호출 많고 asyncio 리팩터 viable X. (3) 스레드에서 실행해야 하는 코드와 통합 (일부 GUI 프레임워크, 일부 C extension). 현대 async-aware 코드엔 threading 이 첫 선택 거의 X.
threading API — 기본
threading.Thread(target=fn, args=(...)) 가 스레드 생성. .start() 가 실행. .join() 이 기다림. threading.Lock(), threading.RLock(), threading.Event(), threading.Condition() 이 동기화 primitive. queue.Queue 가 thread-safe + 스레드 간 데이터 전달 맞는 방법.
concurrent.futures — 더 고레벨 인터페이스
대부분 threading 작업엔 concurrent.futures.ThreadPoolExecutor 가 맞는 도구. task submit, Future 객체 받기, 결과 수집. 스레드 직접 관리보다 깔끔. ProcessPoolExecutor 가 프로세스에 같은 방식 — 같은 API, 다른 동시성 모델.