Existem várias implementações do Python, por exemplo, CPython, IronPython, RPython, etc.
Alguns deles têm um GIL, outros não. Por exemplo, o CPython tem o GIL:
De link
As aplicações escritas em linguagens de programação com um GIL podem ser projetadas para usar processos separados para obter o paralelismo total, já que cada processo possui seu próprio intérprete e, por sua vez, possui seu próprio GIL.
Benefícios do GIL
- Maior velocidade de programas de thread único.
- Integração fácil de bibliotecas C que normalmente não são seguras para threads.
Por que o Python (CPython e outros) usa o GIL
- De link
No CPython, o bloqueio global de intérprete, ou GIL, é um mutex que impede que vários encadeamentos nativos executem bytecodes de Python de uma só vez. Esse bloqueio é necessário principalmente porque o gerenciamento de memória do CPython não é thread-safe.
O GIL é controverso porque impede que programas CPython multissegmentados aproveitem ao máximo os sistemas multiprocessadores em determinadas situações. Observe que operações potencialmente de bloqueio ou de longa execução, como E / S, processamento de imagens e processamento de números NumPy, acontecem fora do GIL. Portanto, é apenas nos programas multithread que passam muito tempo dentro do GIL, interpretando o bytecode CPython, que o GIL se torna um gargalo.
- Do link
O Python tem um GIL em oposição ao bloqueio refinado por vários motivos:
-
É mais rápido no caso de encadeamento único.
-
É mais rápido no caso multi-thread para programas vinculados a E / S.
-
É mais rápido no caso multi-thread para programas ligados a cpu que fazem seu trabalho intensivo de computação em bibliotecas C.
-
Isso torna as extensões C mais fáceis de serem escritas: não haverá alternância de encadeamentos Python, exceto quando você permitir que isso aconteça (por exemplo, entre as macros Py_BEGIN_ALLOW_THREADS e Py_END_ALLOW_THREADS).
-
Ele facilita o acúmulo de bibliotecas C. Você não precisa se preocupar com segurança de thread. Se a biblioteca não for thread-safe, você simplesmente mantém a GIL bloqueada enquanto a chama.
O GIL pode ser liberado por extensões C. A biblioteca padrão do Python libera o GIL em torno de cada chamada de bloqueio de i / o. Assim, o GIL não tem nenhuma consequência para o desempenho de servidores ligados a E / S. Assim, você pode criar servidores de rede no Python usando processos (bifurcação), threads ou i / o assíncrona, e o GIL não atrapalhará.
Bibliotecas numéricas em C ou Fortran também podem ser chamadas com o GIL liberado. Enquanto sua extensão C está esperando por um FFT para completar, o interpretador estará executando outros threads do Python. Uma GIL é, portanto, mais fácil e mais rápida que o bloqueio refinado também neste caso. Isso constitui a maior parte do trabalho numérico. A extensão NumPy libera o GIL sempre que possível.
Threads são geralmente uma maneira ruim de escrever a maioria dos programas de servidor. Se a carga estiver baixa, o bifurcado é mais fácil. Se a carga for alta, a programação assíncrona de E / S e orientada a eventos (por exemplo, usando a estrutura Twisted do Python) é melhor. A única desculpa para usar threads é a falta de os.fork no Windows.
A GIL é um problema se, e somente se, você estiver fazendo um trabalho intensivo de CPU em Python puro. Aqui você pode obter um design mais limpo usando processos e passagem de mensagens (por exemplo, mpi4py). Há também um módulo de processamento na loja de queijos Python, que fornece aos processos a mesma interface dos encadeamentos (ou seja, substituir encadeamento.Thread com processamento.Processo).
Threads podem ser usados para manter a capacidade de resposta de uma GUI, independentemente do GIL. Se a GIL prejudicar seu desempenho (veja a discussão acima), você pode deixar seu segmento gerar um processo e esperar que ele termine.