Ich sehe oft, dass die Leute reden, dass die GIL per Python Interpreter ist (auch hier im Stackoverflow).
Aber was ich im Quelltext sehe, scheint zu sein, dass die GIL eine globale Variable ist und daher für jeden Interpreter in jedem Python-Prozess eine GIL existiert. Ich weiß, dass sie das gemacht haben, weil es kein Interpreter-Objekt wie Lua oder TCL gibt, es wurde einfach nicht gut am Anfang entworfen. Und lokaler Thread-Speicher scheint für die Python-Leute nicht tragbar zu sein.
Stimmt das? Ich habe mir die Version 2.4, die ich in einem Projekt verwende, kurz angeschaut.
Hatte sich das in späteren Versionen geändert, besonders in 3.0?
Die GIL ist in der Tat pro-process, nicht pro-Interpreter. Dies ist unverändert in 3.x.
Vielleicht kommt die Verwirrung zustande, weil die meisten Leute davon ausgehen, dass Python pro Prozess einen Interpreter hat. Ich erinnere mich zu lesen, dass die Unterstützung für mehrere Interpreter über die C-API weitgehend unerprobt und kaum genutzt wurde. (Und als ich es gab, funktionierte nicht richtig.)
Ich glaube, es ist wahr (zumindest ab Python 2.6), dass in jedem Prozess höchstens ein CPython-Interpreter enthalten sein darf (andere Laufzeiten können andere Einschränkungen haben). Ich bin mir nicht sicher, ob dies ein Problem mit der GIL per se ist, aber es ist wahrscheinlich aufgrund des globalen Zustands oder zum Schutz vor einem konfligierenden globalen Zustand in C-Modulen von Drittanbietern. Aus den CPython API-Dokumenten :
[Py
Tags und Links python multithreading gil