1P by neo 3달전 | favorite | 댓글과 토론

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을 비활성화함으로써 얻을 수 있는 성능 이점과 안정성 간의 균형을 잘 맞추는 것이 중요함.