2009-10-18 5 views
8

저는 GIL이 파이썬 인터프리터 당 (심지어 여기 stackoverflow에서)라고 말하는 사람들을 종종 봅니다.Python GIL은 실제로 인터프리터마다 있습니까?

그러나 내가 소스 코드에서 볼 수있는 것은 GIL이 전역 변수이므로 각 파이썬 프로세스의 모든 인터프리터에 대해 하나의 GIL이있는 것으로 보입니다. 루아 또는 TCL처럼 통역 객체가 전달되지 않았기 때문에 그들이 이것을했음을 알았습니다. 처음에는 잘 설계되지 않았습니다. 스레드 로컬 저장소는 비단뱀 녀석들이 사용할 수있는 이식성이없는 것 같습니다.

이 정보가 맞습니까? 프로젝트에서 사용하고있는 2.4 버전을 간단히 살펴 보았습니다.

이 기능은 이후 버전, 특히 3.0에서 변경 되었습니까?

답변

7

GIL은 실제로 통역사가 아닌 프로세스 단위이다. 이것은 3.x에서 변경되지 않았습니다.

0

저는 (적어도 파이썬 2.6에서) 각 프로세스는 하나의 CPython 인터프리터를 임베드 할 수 있다고 믿습니다 (다른 런타임은 다른 제약 조건을 가질 수 있습니다). 이것이 GIL 자체의 문제인지 확실하지 않지만 글로벌 상태로 인한 것일 수도 있고 제 3 자 C 모듈의 충돌하는 전역 상태로부터 보호 할 가능성도 있습니다. CPython API Docs에서 :

[Py를 ___ 초기화는()] 번째 요구 조작은 행해지 지 않는다 (Py_Finalize를 호출하지 않고() 제). 반환 값은 없습니다. 초기화가 실패하면 치명적 오류입니다.

Unladen Swallow 프로젝트에 관심이 있습니다.이 프로젝트는 궁극적으로 CPython에서 GIL을 완전히 제거하는 것을 목표로합니다. 다른 Python 런타임에는 GIL이 전혀 없습니다 (예 : Stackless Python). 확실히 Jython입니다.

또한 GIL은 still present in CPython 3.x입니다.

+1

많은 프로젝트가 이전에 CPython에서 GIL을 제거했습니다. Unladen Swallow는 처음이 아닙니다. 그러나 GIL 버전뿐만 아니라 다른 사람들도 GIL 버전을 사용하지 않았습니다. – nosklo

+1

또한 stackless는 GIL을 제거하지 않습니다. 사실 스택리스 마이크로 쓰레딩의 차단 작동은 전체 애플리케이션을 차단합니다. – nosklo

+0

자이 썬은 너무 느리다. 대부분의 작업이 파이썬에서 이루어지는 자바 프로그램에 스크립팅 플러그인을 사용하지 않는다면 사용할 수 없다. – Lothar

2

아마도 혼란은 대부분의 사람들이 파이썬이 프로세스마다 하나의 인터프리터를 가지고 있다고 가정하기 때문에 발생합니다. C API를 통해 여러 통역사에 대한 지원이 거의 검증되지 않았고 거의 사용되지 않았 음을 읽었습니다. (그리고 내가 그것을 주었을 때, 제대로 작동하지 않았다.)