
Python free-threaded 빌드는 무엇이 달라졌을까? 3.13~3.14 기준 설치·확인·제약 정리
Python에서 스레드를 여러 개 써도 CPU 병렬 실행이 기대만큼 나오지 않는 이유로 GIL(Global Interpreter Lock)이 자주 언급된다. Python 3.13부터는 GIL을 끈 free-threaded 빌드가 도입됐고, 2026년 5월 7일 기준 공식 문서는 설치 방법, 확인 방법, 제약 사항을 별도 문서로 정리하고 있다.
이 글은 Python 공식 문서와 PEP 703을 기준으로, free-threaded 빌드가 무엇인지, Python 3.13과 3.14 문서에서 어떻게 설명되는지, 실제로 확인할 때 어떤 점을 봐야 하는지 객관적인 사실만 정리한 글이다.
Python free-threaded 빌드는 무엇인가?
Python 3.13 공식 문서는 free threading을 GIL이 비활성화된 Python 빌드로 설명한다. 이 빌드의 목적은 여러 CPU 코어에서 스레드를 병렬로 실행할 수 있게 하는 것이다. 다만 모든 프로그램이 자동으로 빨라지는 것은 아니며, 스레딩을 염두에 두고 설계된 프로그램에서 효과를 기대할 수 있다고 문서는 설명한다.
PEP 703은 이 변화를 "CPython에서 GIL을 선택 사항으로 만드는 작업"으로 정의한다. 즉 free-threaded 빌드는 기존 Python 동작을 완전히 대체하는 기본 모드라기보다, 별도 빌드 구성을 통해 GIL 없는 실행 경로를 제공하는 방향으로 이해하는 편이 정확하다.
Python 3.13과 3.14 문서 표현은 어떻게 다른가?
Python 3.13의 "What's New" 문서는 free-threaded mode를 실험적 지원이라고 설명한다. 같은 3.13 HOWTO 문서도 free-threaded mode는 experimental이며 버그와 단일 스레드 성능 저하를 예상해야 한다고 적고 있다.
반면 현재 메인 문서 경로인 Python 3.14 계열 HOWTO는 제목을 "Python support for free threading"으로 바꿔 설명한다. 다만 여기서도 모든 생태계가 준비된 것은 아니라고 분명히 밝힌다. 특히 일부 서드파티 패키지, 그중에서도 extension module을 포함한 패키지는 free-threaded 빌드에서 GIL을 다시 활성화할 수 있다고 안내한다.
정리하면 2026년 5월 7일 기준 공식 문서 흐름은 이렇다.
- Python 3.13: 기능 도입 시점이며 실험적 지원이라고 명시
- Python 3.14 문서: free threading 지원 문서로 발전했지만 패키지 호환성 주의는 계속 유지
어떻게 설치하고 빌드할 수 있나?
공식 HOWTO에 따르면 Python 3.13부터 macOS와 Windows의 공식 설치 프로그램은 free-threaded Python 바이너리를 선택적으로 설치할 수 있다. 소스에서 직접 빌드할 때는 --disable-gil 옵션을 사용해야 한다.
즉 설치 경로는 두 가지다.
- 공식 macOS 또는 Windows 설치 프로그램에서 free-threaded 바이너리 선택
- 소스 빌드 시
--disable-gil옵션 사용
공식 문서는 다른 플랫폼에 대해서는 별도 커뮤니티 가이드를 연결하지만, 이 글에서는 Python 공식 문서에 직접 적힌 정보만 기준으로 다룬다.
내 Python이 free-threaded 빌드인지 어떻게 확인하나?
Python 3.13 HOWTO와 3.14 HOWTO는 확인 방법을 명확히 제시한다. python -VV와 sys.version 문자열에 free-threading build 문구가 들어가면 해당 빌드는 free-threading을 지원한다. 또 sys._is_gil_enabled()로 현재 프로세스에서 GIL이 실제로 켜져 있는지 확인할 수 있다.
빌드 구성 여부를 코드에서 판별할 때는 sysconfig.get_config_var("Py_GIL_DISABLED")를 쓰는 것이 공식 문서가 권장하는 방법이다. 값이 1이면 그 빌드는 free threading을 지원한다.
python -VV
python -c "import sys; print(sys.version)"
python -c "import sys; print(sys._is_gil_enabled())"
python -c "import sysconfig; print(sysconfig.get_config_var('Py_GIL_DISABLED'))"
GIL은 항상 꺼진 상태로 동작하나?
아니다. 공식 HOWTO는 free-threaded 빌드가 런타임에서 GIL을 다시 켤 수 있다고 설명한다. 방법은 환경 변수 PYTHON_GIL 또는 명령행 옵션 -X gil이다.
또 하나 중요한 점은 C API extension module이다. 문서에 따르면 free threading을 명시적으로 지원하지 않는 C 확장 모듈을 import하면, 경고와 함께 GIL이 자동으로 활성화될 수 있다. 따라서 "free-threaded Python을 설치했다"는 사실과 "실제 실행 중에도 끝까지 GIL 없이 동작한다"는 사실은 구분해서 봐야 한다.
스레드 안전성은 자동으로 보장되나?
공식 HOWTO는 dict, list, set 같은 내장 타입이 동시 수정에 대해 내부 락을 사용해 GIL 환경과 비슷한 동작을 목표로 한다고 설명한다. 하지만 이것은 현재 구현 설명일 뿐, 미래 버전까지 보장되는 언어 명세는 아니라고 못 박고 있다.
그래서 문서도 내장 타입의 내부 락에 기대기보다 threading.Lock 같은 동기화 도구를 직접 사용하는 편을 권장한다. free-threaded 빌드가 생겼다고 해서 기존 경쟁 조건이 자동으로 사라지는 것은 아니다.
현재 공식 문서가 말하는 제약은 무엇인가?
Python 3.13 HOWTO는 몇 가지 제한을 구체적으로 적고 있다. 첫째, 3.13의 free-threaded 빌드는 일부 객체를 immortalize해 참조 카운트 갱신 경쟁을 줄인다. 이 때문에 특정 유형의 객체를 많이 만드는 프로그램은 메모리 사용량 증가를 볼 수 있다고 문서는 설명한다.
둘째, 다른 스레드에서 frame 객체에 접근하는 것은 안전하지 않으며 충돌을 일으킬 수 있다. 셋째, 같은 iterator 객체를 여러 스레드가 공유하는 것도 안전하지 않다고 설명한다.
넷째, 3.13 문서는 단일 스레드 성능 오버헤드가 있다고 밝힌다. pyperformance 기준으로 3.13 free-threaded 빌드는 기본 GIL 빌드보다 약 40%의 오버헤드를 보인다고 적고 있으며, 그 주요 이유 중 하나로 specializing adaptive interpreter가 비활성화돼 있다는 점을 든다.
그럼 언제 검토하는 것이 맞을까?
공식 문서 기준으로 free-threaded 빌드는 다음 상황에서 검토 가치가 있다.
- CPU 코어를 활용하는 스레드 병렬 실행이 실제로 필요한 경우
- 사용 중인 패키지, 특히 C 확장 모듈이 free threading 호환 상태인지 별도로 확인할 수 있는 경우
- 단일 스레드 성능 저하나 일부 구현 제약을 감수할 수 있는 경우
반대로 I/O 중심 워크로드이거나, 핵심 라이브러리가 아직 free-threaded 빌드를 제대로 지원하지 않는다면 기본 GIL 빌드를 유지하는 편이 더 단순할 수 있다. 이 판단은 성능 기대치보다 패키지 호환성과 운영 안정성 확인이 먼저다.
FAQ
Q. Python 3.13을 설치하면 기본으로 free-threaded 빌드를 쓰게 되나?
아니다. Python 3.13 공식 문서는 free-threaded mode가 기본값이 아니라고 설명한다. 별도 실행 파일이나 설치 선택지, 또는 소스 빌드 구성이 필요하다.
Q. free-threaded 빌드면 모든 패키지가 그대로 동작하나?
공식 3.14 HOWTO는 일부 서드파티 패키지, 특히 extension module이 포함된 패키지가 아직 준비되지 않았을 수 있다고 설명한다. 이런 패키지는 GIL을 다시 활성화할 수 있다.
Q. 동시성 버그가 자동으로 사라지나?
아니다. 공식 문서도 내장 타입의 현재 동작을 언어 차원의 보장으로 보지 말라고 설명하며, threading.Lock 같은 동기화 수단을 계속 사용할 것을 권장한다.
정리
Python free-threaded 빌드는 GIL이 없는 Python을 바로 기본값으로 바꾼 것이 아니라, Python 3.13부터 선택 가능한 별도 빌드 경로를 추가한 변화다. 2026년 5월 7일 기준 공식 문서를 보면 3.13에서는 실험적 지원으로 소개됐고, 3.14 문서에서는 지원 문서가 정리됐지만 패키지 호환성과 일부 제약은 여전히 중요한 확인 항목이다.
따라서 실무에서는 설치 여부보다 먼저 현재 빌드가 free-threading을 지원하는지, 실행 중 GIL이 다시 켜졌는지, 핵심 패키지가 이를 지원하는지, 그리고 단일 스레드 성능 저하를 감수할 수 있는지를 함께 점검하는 편이 정확하다.
참고 자료
'프로그래밍 > C, C++, Java, Python' 카테고리의 다른 글
| Python uuid7은 언제 써야 할까? 정렬 가능한 ID 선택 기준 정리 (0) | 2026.05.12 |
|---|---|
| 윈도우 소리를 맥북 스피커로 보내기: FFmpeg와 VB-CABLE로 만든 개인용 네트워크 스피커 (0) | 2026.05.07 |
| Discord에서 Codex를 이어 쓰는 로컬 브리지 만들기 (0) | 2026.05.05 |
| 삼성 SW 역량테스트 B형/Pro 대비 - 최적화 기법 (0) | 2021.03.30 |
| Modbus TCP 통신을 위한 프로토콜 파헤치기 & 예제 코드 (0) | 2021.02.02 |





