Python GIL 해제 연산의 병렬 처리 구조 - 100-hours-a-week/5-yeosa-wiki GitHub Wiki
1. GIL의 기본 특성
- Python(CPython)은 GIL(Global Interpreter Lock) 때문에 한 번에 하나의 스레드만 실행 가능
- 순수 Python 코드(
for
,list
,str
등)는 GIL 때문에 병렬 실행 안 됨
2. C/C++ 확장 연산(GIL 해제 연산)의 병렬 처리 원리
NumPy
,PIL
,PyTorch
,OpenCV
,scikit-learn
등은 내부가 C/C++로 작성됨- 이 연산들은 실행 시 GIL을 일시 해제하고,
- 그 연산을 자체 스레드 (C 레벨 스레드) 로 처리
3. Python에서 여러 스레드로 GIL 해제 연산을 실행하면?
-
각 Python 스레드는 연산을 시작하고 GIL을 놓은 뒤 대기 상태로 전환
-
그 사이 다른 Python 스레드가 GIL을 획득해 실행되거나,
각 연산은 자체적으로 C 스레드를 생성해 병렬 처리됨
4. 결과적으로 시스템에서 실행 중인 스레드 구성은?
구성 | 설명 |
---|---|
Python 워커 스레드 (N개) | 각 연산을 독립적으로 실행 |
C 내부 연산 스레드 (M개 per 작업) | 각 연산이 생성하는 내부 병렬 스레드 |
총 실행 스레드 수 | N (Python) + N × M (C 내부) |
-
예: ThreadPoolExecutor로 4개의
PIL.Image.resize()
를 병렬 실행하면,→ Python 스레드 4개 + C 내부 스레드들(예: libjpeg 스레드들)
5. 핵심 요약
- GIL 해제 연산은 Python 스레드가 대기하는 동안 C 스레드들이 진짜 병렬 연산을 수행하고, 그 사이 Python은 다른 스레드에게 GIL을 넘기며 계속 병렬 실행된다.