Conheça o "GIL"
O GIL e o futuro - agora presente no Python-3.13 em diante.
O Python Global Interpreter Lock (GIL)[^GIL] é um mecanismo de sincronização que permite que apenas uma thread execute código Python por vez em um processo.
É uma das características mais distintivas e, por vezes, controversas da implementação padrão do Python (CPython).
Adaptado do original publicado em: https://www.adrianovieira.eng.br/posts/development/python/python-gil/
Como funciona o GIL
O GIL é essencialmente um mutex global que protege o acesso aos objetos Python,
impedindo que múltiplas threads nativas executem código Python simultaneamente.
Quando uma thread precisa executar código Python, ela deve primeiro adquirir o GIL.
Assim, outras threads ficam bloqueadas até que o GIL seja liberado.
Por que o GIL existe
O GIL foi criado para resolver problemas de gerenciamento de memória no CPython:
- Proteção do contador de referências: O Python usa contagem de referências para gerenciamento de memória. Sem o GIL, múltiplas threads poderiam modificar simultaneamente os contadores de referência dos objetos, causando vazamentos de memória ou liberação prematura de objetos.
- Simplicidade de implementação: O GIL simplifica significativamente a implementação do interpretador, evitando a necessidade de alocação em toda a base de código.
- Proteção de extensões C: Muitas extensões C não são thread-safe, e o GIL garante que não sejam executadas concorrentemente.
Limitações do GIL
O GIL impõe restrições importantes ao paralelismo:
- Threading limitado: Threads Python não podem executar código Python verdadeiramente em paralelo, limitando os benefícios do multithreading para tarefas de intensivo de CPU (CPU-intensivas).
- Serialização de execução: Mesmo em sistemas multi-core, apenas um core pode executar código Python por vez.
- Contenção: Em aplicações com muitas threads, a competição pelo GIL pode causar sobrecarga intensa.
E quando o GIL é liberado
O GIL é automaticamente liberado em certas situações, como:
- Durante operações de I/O (leitura/escrita de arquivos, requisições de rede)
- Quando executa funções C que explicitamente liberam o GIL
- Em intervalos regulares durante loops longos (aproximadamente a cada 100 instruções)
- Durante operações que podem bloquear (como
time.sleep()
)
Alternativas e soluções
- Multiprocessos: Usar processos separados em vez de threads contorna completamente o GIL, já que cada processo tem seu próprio interpretador.
- Extensões C: Operações computacionalmente intensivas podem ser implementadas em C/Cython, que podem liberar o GIL durante a execução.
- Implementações alternativas: Uso de diferentes engine como PyPy, Jython e IronPython que têm abordagens diferentes para threading, embora nem todas eliminem completamente o GIL.
- Async/await: Para I/O concorrente, a programação assíncrona é frequentemente mais eficiente que threading.
O GIL pode ser desativado?
SIMMMmmm
A implementação da PEP 703 é um projeto de longo prazo que vem ocorrendo em múltiplas etapas ao longo de vários anos, onde o CPython transitará para tornar a versão sem GIL primeiro experimental, opcional, depois suportada, e finalmente a versão padrão.
Status Atual - Python 3.13
O Global Interpreter Lock pode ser desativado, e isso já é uma realidade desde o Python 3.13!
O Python-3.13, lançado em outubro de 2024, inclui suporte experimental para desabilitar o GIL através do "free-threaded mode".
No Fedora Linux, após instalar o pacote python3.13-freethreading
, você pode executar a versão sem GIL usando o comando python3.13t
.
O Futuro - Python 3.14
A Python-3.14, prevista para ser lançada agora em outubro/2025, já implementa a PEP 779 (PEP 779 Free-threaded Python) que traz suporte oficial sem GIL como recurso opcional. Então, caso queira usar esta versão no Fedora Linux, deve instalar o pacote python3.14-freethreading
, você pode executar a versão sem GIL usando o comando python3.14t
.
Have fun, pythonista
Top comments (0)