GIL 비활성화 허용
-
PYTHON_GIL=0
또는 -X gil=0
을 설정하여 GIL(Global Interpreter Lock)을 비활성화할 수 있게 됨.
- GIL 관련 데이터 구조는 초기화되지만, GIL을 비활성화하면
take_gil()
과 drop_gil()
이 조기에 반환되도록 함.
- GIL을 비활성화한 상태에서 몇 가지 테스트와 작은 프로그램을 실행해 보았고, 기본적인 스레드 프로그램도 때때로 작동함.
- 전체 테스트 스위트를 실행하려고 하면
test_asyncio
에서 빠르게 충돌함.
GIL 비활성화 메커니즘 추가
- GIL 비활성화 메커니즘을 추가하는 이슈(#116167)에 대한 논의가 있었음.
- 자유 스레드 빌드에서 GIL을 비활성화할 수 있는 기능이 추가됨.
- GIL을 다시 활성화하는 작업(#116322)과 기본적으로 GIL을 비활성화하는 작업(#116329)을 추적함.
코드 리뷰 및 테스트
- 코드 리뷰 요청과 테스트 케이스 추가에 대한 논의가 있었음.
-
PYTHON_GIL
환경 변수에 대한 문서화와 사용자 피드백을 얻기 위한 제안이 있었음.
-
-X gil
옵션 추가와 sys.flags
에 반영, 환경 변수를 다루는 테스트 수정이 포함됨.
GN⁺의 의견
- 이 변경은 Python 커뮤니티에 큰 영향을 미칠 수 있는데, GIL은 Python의 멀티스레딩 성능에 제한을 주는 잘 알려진 요소이기 때문임.
- GIL을 비활성화하는 기능은 성능 향상을 가져올 수 있지만, 동시에 안정성과 호환성 문제를 일으킬 수 있어 신중한 접근이 필요함.
- GIL 없이 Python을 실행하는 것은 특히 병렬 처리와 관련된 작업에서 이점을 제공할 수 있으나, 기존의 많은 Python 코드가 GIL을 전제로 작성되어 있어서 이러한 변화가 가져올 영향을 평가하는 것이 중요함.
- 다른 언어나 런타임에서는 GIL과 유사한 메커니즘을 사용하지 않는 경우가 많으며, 예를 들어 Node.js는 비동기 I/O를 통해 단일 스레드 성능을 극대화하는 접근 방식을 취함.
- 이 기술을 도입할 때는 기존 코드의 스레드 안전성을 검토하고, 필요한 경우 리팩토링을 고려해야 함. GIL을 비활성화함으로써 얻을 수 있는 성능 이점과 안정성 간의 균형을 잘 맞추는 것이 중요함.