Esta postagem do criador do Python, Guido Van Rossum, menciona uma tentativa inicial de remover o GIL do Python:
Isso já foi tentado antes, com resultados decepcionantes, e é por isso que estou relutante em me esforçar muito. Em 1999, Greg Stein (com Mark Hammond?) Produziu uma bifurcação de Python (1,5 acredito) que removeu o GIL, substituindo-o por bloqueios refinados em todas as estruturas de dados mutáveis. Ele também enviou patches que removeram muitas das dependências nas estruturas globais de dados mutáveis, que eu aceitei. No entanto, após o benchmarking, foi mostrado que, mesmo na plataforma com a primitiva de bloqueio mais rápida (Windows na época), a execução de thread único desacelerava quase duas vezes, o que significa que, em duas CPUs, você poderia trabalhar um pouco mais feito sem o GIL do que em uma única CPU com o GIL. Isso não foi suficiente, e o remendo de Greg desapareceu no esquecimento. (Veja o artigo de Greg sobre o desempenho.)
Mal posso argumentar com os resultados reais, mas realmente me pergunto por que isso aconteceu. Presumivelmente, a principal razão pela qual a remoção do GIL do CPython é tão difícil é por causa do sistema de gerenciamento de memória de contagem de referência. Um programa típico Python chamará Py_INCREF
e Py_DECREF
milhares ou milhões de vezes, tornando-se um ponto de discórdia chave se estávamos para quebrar bloqueios em torno dele.
Mas não entendo por que adicionar primitivas atômicas atrasaria um único programa encadeado. Suponha que apenas modificamos o CPython para que a variável refcount em cada objeto Python seja uma primitiva atômica. E então fazemos apenas um incremento atômico (instruções de busca e adição) quando precisamos incrementar a contagem de referência. Isso faria com que a referência do Python contasse com segurança para threads e não deveria ter nenhuma penalidade de desempenho em um aplicativo de thread único, porque não haveria contenção de bloqueio.
Mas, infelizmente, muitas pessoas que são mais espertas que eu tentaram e falharam, então, obviamente, estou perdendo alguma coisa aqui. O que há de errado com a maneira como estou encarando esse problema?