Questo post del creatore di Python, Guido Van Rossum, menziona un primo tentativo di rimuovere il GIL da Python:
Questo è già stato provato, con risultati deludenti, motivo per cui sono riluttante a impegnarmi molto da solo. Nel 1999 Greg Stein (con Mark Hammond?) Produsse un fork di Python (1.5 credo) che rimosse il GIL, sostituendolo con blocchi a grana fine su tutte le strutture di dati mutabili. Ha anche inviato patch che hanno rimosso molte delle dipendenze da strutture di dati mutabili globali, che ho accettato. Tuttavia, dopo il benchmarking, è stato dimostrato che anche sulla piattaforma con la primitiva di blocco più veloce (Windows al momento) ha rallentato l'esecuzione a thread singolo quasi due volte, il che significa che su due CPU, potresti ottenere solo un po 'più di lavoro fatto senza GIL che su una singola CPU con GIL. Questo non era abbastanza e la patch di Greg scomparve nell'oblio. (Vedi il commento di Greg sulla performance.)
Difficilmente posso discutere con i risultati reali, ma mi chiedo davvero perché sia successo. Presumibilmente, il motivo principale per cui la rimozione di GIL da CPython è così difficile è dovuto al sistema di gestione della memoria di conteggio dei riferimenti. Un tipico programma Python chiamerà Py_INCREF
e Py_DECREF
migliaia o milioni di volte, rendendolo un punto di contesa chiave se dovessimo avvolgere i blocchi attorno ad esso.
Ma non capisco perché l'aggiunta di primitivi atomici possa rallentare un singolo programma thread. Supponiamo di aver appena modificato CPython in modo che la variabile refcount in ogni oggetto Python fosse una primitiva atomica. E poi facciamo solo un incremento atomico (istruzioni fetch-and-add) quando dobbiamo incrementare il conteggio dei riferimenti. Ciò renderebbe il conteggio dei riferimenti Python sicuro per i thread e non dovrebbe comportare alcuna riduzione delle prestazioni in un'applicazione a thread singolo, poiché non vi sarebbero contese di blocco.
Ma ahimè, molte persone 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?