GIL(Global Interpreter Lock)은 「CPython 인터프리터에서 한 시점에 하나의 스레드만 파이썬 바이트코드 실행」을 강제하는 락입니다.
파이썬 동시성의 가장 유명한 한계.
왜 있는가.
CPython 내부 자료구조(특히 참조 카운트)가 thread-safe 안 함.
GIL이 없으면 매 객체 접근에 락이 필요해 단일 스레드 성능이 크게 떨어짐.
GIL은 「단일 스레드 빠름 + 멀티 스레드 한계」의 트레이드오프.
어디에 영향.
CPU 바운드(루프 돌리기·계산) — 스레드 4개 써도 1개와 비슷한 속도.
IO 바운드(네트워크·디스크) — IO 대기 중엔 GIL 풀어 줌 → 효과 있음.
NumPy·pandas의 C 코드 — 자체적으로 GIL 풀어서 병렬 가능.
우회법.
multiprocessing — 프로세스 단위라 GIL 무관.
Cython·numba — GIL 풀고 C 수준 실행.
asyncio — IO 동시성에 GIL 무관.
C 확장 모듈 — 자체적으로 GIL 풀 수 있음.
Python 3.13의 실험적 no-GIL.
「선택적 GIL 제거」가 실험적으로 들어옴.
단일 스레드 성능을 약간 희생하고 멀티스레드 진정 병렬 가능.
미래에 표준이 될지 주목할 사안.
당장은 multiprocessing이 안전한 답.
한 줄 요약
GIL은 CPython의 한 시점 한 스레드 제약.
CPU 바운드에 영향, IO·NumPy 코드는 우회 가능.
multiprocessing·Cython·asyncio가 우회 도구.
Python 3.13의 no-GIL 실험적 도입.
더 알아볼 것
- PEP 703 — Making the GIL Optional
- CPython 외 — Jython·IronPython은 GIL 없음
- release_gil — C 확장에서 풀기