Dieser Beitrag des Python-Erstellers Guido Van Rossum erwähnt einen frühen Versuch, die GIL aus Python zu entfernen:
Dies wurde bereits zuvor mit enttäuschenden Ergebnissen versucht, weshalb ich mich nur ungern selbst anstrengen möchte. 1999 produzierte Greg Stein (mit Mark Hammond?) Eine Python-Gabel (1,5, glaube ich), die die GIL entfernte und durch fein abgestimmte Sperren für alle veränderlichen Datenstrukturen ersetzte. Er reichte auch Patches ein, die viele der Abhängigkeiten von globalen veränderlichen Datenstrukturen beseitigten, die ich akzeptierte. Nach dem Benchmarking zeigte sich jedoch, dass selbst auf der Plattform mit dem schnellsten Locking-Primitiv (zu der Zeit Windows) die Single-Thread-Ausführung fast doppelt so stark verlangsamt wurde, was bedeutet, dass auf zwei CPUs nur ein wenig mehr Arbeit anfällt auf die GIL verzichtet als auf eine einzelne CPU mit der GIL. Das war nicht genug und Gregs Fleck verschwand in Vergessenheit. (Siehe Gregs Bericht über die Aufführung.)
Ich kann kaum mit den tatsächlichen Ergebnissen streiten, aber ich frage mich wirklich, warum das passiert ist. Vermutlich liegt der Hauptgrund dafür, dass das Entfernen der GIL aus CPython so schwierig ist, in dem Speicherverwaltungssystem mit Referenzzählung. Ein typisches Python - Programm aufrufen Py_INCREFund Py_DECREFTausende oder Millionen Mal, eine Schlüsselverzweigungspunkt zu machen , wenn wir um ihn herum wickeln Schlösser waren.
Aber ich verstehe nicht, warum das Hinzufügen von atomaren Primitiven ein einzelnes Thread-Programm verlangsamen würde . Angenommen, wir haben gerade CPython so geändert, dass die refcount-Variable in jedem Python-Objekt ein atomares Grundelement war. Und dann machen wir einfach eine atomare Inkrementierung (Fetch-and-Add-Anweisung), wenn wir den Referenzzähler erhöhen müssen. Dies würde die Python-Referenzzählung thread-sicher machen und sollte keine Leistungseinbußen bei einer Single-Thread-Anwendung zur Folge haben, da es keine Sperrkonflikte geben würde.
Aber leider haben viele Leute, die schlauer als ich sind, es versucht und sind gescheitert, also vermisse ich hier offensichtlich etwas. Was ist falsch daran, wie ich dieses Problem betrachte?