- CPython PR #116338은 free-threaded 빌드에서
PYTHON_GIL=0또는-X gil=0으로 GIL을 비활성화할 수 있게 하는 변경을python:main에 병합함 - 런타임에서 GIL을 다시 켤 수 있는 가능성을 남기기 위해 GIL 관련 자료구조는 평소처럼 초기화하고, 비활성화는 시작 시 플래그를 설정해
take_gil()과drop_gil()이 일찍 반환하도록 처리함 - 초기 확인에서는
PYTHON_GIL=0설정으로 스레드를 쓰지 않는 일부 테스트와 작은 프로그램은 정상 동작했고, 매우 기본적인 스레드 프로그램은 때때로 동작했지만 전체 테스트 스위트는test_asyncio에서 빠르게 크래시함 - 리뷰 과정에서
PYTHON_GIL테스트, 문서화,-X gil옵션,sys.flags반영이 추가됐고,PYTHON_GIL=1이 GIL 활성화를 강제하도록 설정 처리도 수정됨 - 후속 작업은 호환되지 않는 확장을 로드할 때 GIL을 다시 켜는 문제와 GIL을 기본 비활성화하는 문제로 분리됐으며, 이 변경은 Python 3.13의 free-threaded 빌드에서 GIL 제어 표면을 추가함
병합된 변경
- CPython PR #116338은
gh-116167: Allow disabling the GIL with PYTHON_GIL=0 or -X gil=0변경을 다룸 colesbury가 2024년 3월 11일python:main에 병합함- 변경 규모는 12개 파일, 163줄 추가, 1줄 삭제로 표시됨
- 대상 기능은 일반 빌드가 아니라 free-threaded 빌드에서 GIL을 비활성화하는 실행 옵션임
GIL 비활성화 방식
- free-threaded 빌드에서 다음 설정으로 GIL을 비활성화할 수 있음
PYTHON_GIL=0-X gil=0
- 런타임에서 GIL을 다시 켤 수 있도록, 모든 GIL 관련 자료구조는 평소처럼 초기화됨
- 실제 비활성화는 시작 시 플래그를 설정하는 방식임
- 이 플래그 때문에
take_gil()과drop_gil()이 일찍 반환함
- 이 플래그 때문에
- 리뷰 중
PYTHON_GIL=1일 때enable_gil을 올바르게 설정하는 커밋도 추가됨
테스트와 현재 제약
PYTHON_GIL=0설정으로 일부 테스트와 작은 프로그램을 점검함- 스레드를 사용하지 않는 테스트와 작은 프로그램은 정상 동작하는 것으로 확인됨
- 매우 기본적인 스레드 프로그램은 때때로 동작함
- 전체 테스트 스위트는 빠르게 크래시했으며, 위치는
test_asyncio로 기록됨 !buildbot nogil명령으로 NoGIL 관련 빌더 테스트가 여러 차례 예약됨x86-64 MacOS Intel ASAN NoGIL PRx86-64 MacOS Intel NoGIL PRARM64 MacOS M1 Refleaks NoGIL PRARM64 MacOS M1 NoGIL PRAMD64 Ubuntu NoGIL Refleaks PRAMD64 Ubuntu NoGIL PRAMD64 Windows Server 2022 NoGIL PR
리뷰 중 추가된 범위
corona10은Lib/test/test_cmd_line.py에 환경 변수 테스트를 추가할 가치가 있다고 제안함- 이후 다음 커밋들이 추가됨
Add test for PYTHON_GIL in test_cmd_lineSet enable_gil properly when PYTHON_GIL=1Don't add 'enable_gil' to test_embed in normal builds
colesbury는 환경 변수를 추가하는 시점에 문서화하는 것이 좋다고 봄- 이미
--disable-gilconfigure 플래그는 문서화되어 있다는 점을 근거로 듦 - 문서에는 free-threaded 빌드에서만 사용 가능하다는 점,
0은 GIL 비활성화 강제,1은 GIL 활성화 강제, Python 3.13 신규 사항을 포함해야 한다고 정리함
- 이미
- 이후
Document PYTHON_GIL environment variable커밋이 추가됨
-X gil 옵션 추가와 최종 병합
- Discord 논의 이후 환경 변수와 함께 사용할
-X옵션도 추가하기로 함 - PR 제목은
PYTHON_GIL=0만 다루던 형태에서PYTHON_GIL=0 or -X gil=0까지 포함하도록 변경됨 - 추가 커밋에는 다음 내용이 포함됨
Add -X gil option, add to sys.flags, modify test to cover env var… and optionFix link to -X gilFix PYTHON_GIL versionchanged lineClarify test_flags in normal builds
ericsnowcurrently,erlend-aasland,corona10,colesbury가 변경을 승인함- 병합 커밋은
2731913이며, 병합 뒤vstinner는 이 변경을 “흥미롭고 매우 무섭다”고 반응함