Existem várias implementações de Python, por exemplo, CPython, IronPython, RPython, etc.
Alguns deles têm um GIL, outros não. Por exemplo, o CPython possui o GIL:
De http://en.wikipedia.org/wiki/Global_Interpreter_Lock
Os aplicativos escritos em linguagens de programação com um GIL podem ser projetados para usar processos separados para obter paralelismo total, pois cada processo tem seu próprio intérprete e, por sua vez, seu próprio GIL.
Benefícios do GIL
- Maior velocidade de programas de thread único.
- Fácil integração de bibliotecas C que geralmente não são seguras para threads.
Por que Python (CPython e outros) usa o GIL
No CPython, o bloqueio global de intérpretes, ou GIL, é um mutex que impede que vários threads nativos executem bytecodes do Python de uma só vez. Esse bloqueio é necessário principalmente porque o gerenciamento de memória do CPython não é seguro para threads.
O GIL é controverso porque impede que os programas CPython multithread aproveitem ao máximo os sistemas multiprocessadores em determinadas situações. Observe que operações potencialmente bloqueadoras ou de execução demorada, como E / S, processamento de imagens e processamento de números NumPy, ocorrem fora do GIL. Portanto, é apenas em programas multithread que passam muito tempo dentro do GIL, interpretando o bytecode do CPython, que o GIL se torna um gargalo.
O Python possui um GIL em oposição ao bloqueio de baixa granularidade por vários motivos:
É mais rápido no caso de rosca única.
É mais rápido no caso multithread para programas vinculados de E / S.
É mais rápido no caso multithread para programas vinculados à CPU que fazem seu trabalho intensivo em computação nas bibliotecas C.
Isso facilita a escrita das extensões C: não haverá troca de threads do Python, exceto onde você permitir que isso aconteça (ou seja, entre as macros Py_BEGIN_ALLOW_THREADS e Py_END_ALLOW_THREADS).
Isso facilita a quebra de bibliotecas C. Você não precisa se preocupar com a segurança da linha. Se a biblioteca não for segura para threads, basta manter o GIL bloqueado enquanto você o 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 E / S de bloqueio. Portanto, o GIL não tem conseqüências para o desempenho de servidores vinculados de E / S. Assim, você pode criar servidores de rede em Python usando processos (bifurcação), threads ou E / S assíncrona, e o GIL não interferirá em seu caminho.
Bibliotecas numéricas em C ou Fortran também podem ser chamadas com o GIL liberado. Enquanto sua extensão C estiver aguardando a conclusão de uma FFT, o intérprete estará executando outros threads do Python. Um GIL é, portanto, mais fácil e rápido do que o bloqueio refinado neste caso também. Isso constitui a maior parte do trabalho numérico. A extensão NumPy libera o GIL sempre que possível.
Threads geralmente são uma maneira ruim de escrever a maioria dos programas de servidor. Se a carga for baixa, o garfo será mais fácil. Se a carga for alta, a E / S assíncrona e a programação orientada a eventos (por exemplo, usando a estrutura Twisted do Python) são melhores. A única desculpa para o uso de threads é a falta de os.fork no Windows.
O 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 'processing' na loja de queijos Python, que fornece aos processos a mesma interface que os threads (por exemplo, substitua threading.Thread por processing.Process).
Os encadeamentos podem ser usados para manter a capacidade de resposta de uma GUI, independentemente do GIL. Se o GIL prejudicar seu desempenho (consulte a discussão acima), você pode permitir que seu thread inicie um processo e aguarde o término.