Questo post dal creatore di Python, Guido Van Rossum, menziona un primo tentativo di rimuovere GIL da Python:
This has been tried before, with disappointing results, which is why I'm reluctant to put much effort into it myself. In 1999 Greg Stein (with Mark Hammond?) produced a fork of Python (1.5 I believe) that removed the GIL, replacing it with fine-grained locks on all mutable data structures. He also submitted patches that removed many of the reliances on global mutable data structures, which I accepted. However, after benchmarking, it was shown that even on the platform with the fastest locking primitive (Windows at the time) it slowed down single-threaded execution nearly two-fold, meaning that on two CPUs, you could get just a little more work done without the GIL than on a single CPU with the GIL. This wasn't enough, and Greg's patch disappeared into oblivion. (See Greg's writeup on the performance.)
Difficilmente riesco a discuterne con i risultati effettivi, ma mi chiedo davvero perché sia successo. Presumibilmente, il motivo principale per cui la rimozione di GIL da CPython è così difficile è a causa del sistema di gestione della memoria di conteggio di riferimento. Un tipico programma Python chiamerà Py_INCREF
e Py_DECREF
migliaia o milioni di volte, rendendolo un punto di contesa chiave se dovevamo avvolgere le serrature intorno.
Ma non capisco perché l'aggiunta di primitive atomiche possa rallentare un programma con thread singolo . Supponiamo di aver appena modificato CPython in modo che la variabile refcount in ogni oggetto Python fosse una primitiva atomica. Quindi eseguiamo un incremento atomico (istruzione fetch-and-add) quando è necessario incrementare il conteggio dei riferimenti. Ciò renderebbe il conteggio dei riferimenti di Python sicuro per i thread e non dovrebbe comportare alcuna penalizzazione delle prestazioni in un'applicazione a thread singolo, perché non ci sarebbe alcuna contesa di blocco.
Ma ahimè, molte persone che sono più intelligenti di me hanno provato e fallito, quindi ovviamente mi manca qualcosa qui. Cosa c'è di sbagliato nel modo in cui sto guardando questo problema?