DEV Community

Adriano Vieira
Adriano Vieira

Posted on

Concorrência em Python e o GIL

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)