W tym poście od twórcy Pythona, Guido Van Rossuma, wspomniano o wczesnej próbie usunięcia GIL z Pythona:
Zostało to już wcześniej wypróbowane, z rozczarowującymi rezultatami, dlatego sam niechętnie wkładam w to wiele wysiłku. W 1999 roku Greg Stein (wraz z Markiem Hammondem?) Opracował rozwidlenie Pythona (1.5), które usunęło GIL, zastępując go drobnoziarnistymi blokadami wszystkich zmiennych danych. Przekazał także łatki, które usunęły wiele zależności od globalnych zmiennych danych, które zaakceptowałem. Jednak po przeprowadzeniu testów porównawczych wykazano, że nawet na platformie z najszybszym programem prymitywnym blokującym (w tym czasie systemem Windows) spowolniło wykonywanie wątków jednowątkowych prawie dwukrotnie, co oznacza, że na dwóch procesorach można uzyskać trochę więcej pracy wykonane bez GIL niż na jednym procesorze z GIL. To nie wystarczyło, a łatka Grega zniknęła w zapomnieniu. (Zobacz opis Grega na temat wydajności.)
Trudno mi się kłócić z rzeczywistymi wynikami, ale naprawdę zastanawiam się, dlaczego tak się stało. Przypuszczalnie głównym powodem, dla którego usunięcie GIL z CPython jest tak trudne, jest system zarządzania pamięcią zliczania referencji. Typowym programem Python zadzwoni Py_INCREFi Py_DECREFtysiące lub miliony razy, dzięki czemu jest kluczowy punkt rywalizacji gdybyśmy zamki owinąć wokół niego.
Ale nie rozumiem, dlaczego dodanie prymitywów atomowych będzie spowalniać jednego programu gwintowaną. Załóżmy, że właśnie zmodyfikowaliśmy CPython, tak aby zmienna przeliczania w każdym obiekcie Pythona była atomowa. A następnie wykonujemy przyrost atomowy (instrukcja pobierania i dodawania), gdy musimy zwiększyć liczbę referencji. To sprawiłoby, że liczenie odniesień w Pythonie byłoby bezpieczne i nie powinno mieć żadnego ograniczenia wydajności dla aplikacji jednowątkowej, ponieważ nie byłoby rywalizacji o blokowanie.
Ale, niestety, wiele osób mądrzejszych ode mnie próbowało i poniosło porażkę, więc oczywiście coś tu brakuje. Co jest złego w sposobie, w jaki patrzę na ten problem?