Python 제작자 인 Guido Van Rossum 의이 게시물 은 Python에서 GIL을 제거하려는 초기 시도를 언급합니다.
이것은 실망스런 결과와 함께 이전에 시도되었으므로 직접 노력하기를 꺼려합니다. 1999 년 그레그 스타 인 (Mark Hammond?)은 GIL을 제거하는 파이썬 포크 (1.5)를 만들어 모든 가변 데이터 구조에 대한 세밀한 잠금으로 대체했습니다. 또한 글로벌 가변 데이터 구조에 대한 많은 의존성을 제거하는 패치를 제출했습니다. 그러나 벤치마킹 후 가장 빠른 잠금 기본 요소 (당시 Windows)가있는 플랫폼에서도 단일 스레드 실행 속도가 거의 두 배로 느려짐을 알 수있었습니다. 이는 두 CPU에서 약간 더 많은 작업을 수행 할 수 있음을 의미합니다. GIL이있는 단일 CPU보다 GIL없이 수행됩니다. 이것으로 충분하지 않았으며 Greg의 패치는 망각으로 사라졌습니다. (성에 대한 Greg의 저술을 참조하십시오.)
실제 결과에 대해서는 거의 논쟁 할 수 없지만 왜 이런 일이 일어 났는지 궁금합니다. CPython에서 GIL을 제거하는 것이 어려운 이유는 레퍼런스 카운팅 메모리 관리 시스템 때문일 것입니다. 일반적인 파이썬 프로그램을 호출 Py_INCREF하고 Py_DECREF우리가 주위에 잠금 장치를 포장한다면 그에게 중요한 경쟁 포인트를 만들고, 수천 또는 수백만 번.
그러나 원자 기본 요소를 추가하면 단일 스레드 프로그램 이 느려지는 이유를 이해할 수 없습니다 . 각 Python 객체의 refcount 변수가 원자 기본 요소가되도록 CPython을 수정했다고 가정하십시오. 그리고 참조 카운트를 증가시킬 필요가있을 때 원자 단위 증가 (fetch-and-add 명령어)를 수행합니다. 이것은 파이썬 참조 계산을 스레드로부터 안전하게 만들고 잠금 경합이 없기 때문에 단일 스레드 응용 프로그램에서 성능 저하가 없어야합니다.
그러나 아아, 나보다 똑똑한 많은 사람들이 시도하고 실패했기 때문에 분명히 여기에 뭔가 빠져 있습니다. 이 문제를보고있는 방식에 어떤 문제가 있습니까?