Skip to content

wellington-tinho/GIL-Python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

GIL
GIL em Python

O que é GIL | Para que é usado | Impacto nos programas

O que é GIL?

GIL é o acronimo para Global Interpreter Lock.

O Python Global Interpreter Lock, ou simplesmente GIL, é um mutex (ou lock) que permite que apenas uma thread tome conta do interpretador Python. Isso significa que somente uma thread pode estar em um estado de execução em qualquer ponto do tempo.


Para que é usado?

Quando é declarado uma variavel em Python, ex: x = 10, este não aloca um local de memória onde 10 está armazenado, e sim cria um objeto na memória heap onde x conterá uma referência para o objeto 10.

No caso de x posteriormente receber None, ex: x = None, Python irá verificar que o numero de referências ao objeto, que no caso por agora não conter uma referencia para o mesmo, terá 0 referências, e será setado como "Dead Object" pelo algoritmo "Garbage Collector", (Coletor de lixo).

O algoritmo utilizado pelo Garbage Collector do Python é chamado de Reference Counting. Você pode obter o numero de contagem de algum argumento atravês do seguinte comando sys.getrefcount(<arg>)

O problema é que essa forma de gerenciamento de memória utilizando reference couting precisa de proteção para um fenômeno chamado 'race conditions', onde duas threads aumentam ou diminuem seu valor simultaneamente. Pois se isso acontecer, poderá causar problemas de memória, onde poderá nunca excluir um objeto ou até liberação incorreta do mesmo enquanto ainda existe referência, causando Bugs.

Devido a isso é usado o GIL, aplicando a regra de execução de qualquer código Python a single lock previnindo qualquer Deadlock 1, que por outro lado transforma qualquer código Python em single-thread.


Impacto nos programas

GIL

$ python single_thread.py
Time taken in seconds -  3.3819386959075928

GIL

$ python multi_threaded.py
Time taken in seconds - 4.140527248382568

Como foi notado, ambas as versões levam quase a mesma quantidade de tempo para serem concluídas. Na versão multithread custou ainda mais tempo do que na versão single, pois o GIL impediu que os threads ligados à CPU fossem executados em paralelo, devido a estrutura de como é feita a interpretação de códigos em Python, exemplificado abaixo.

GIL

Referente a figura acima podemos notar que multiprocessing está acima do GIL, na qual você usa vários processos em vez de threads. Onde cada processo Python obtém seu próprio interpretador Python e espaço na memória. O Python possui um módulo denominado de multiprocessing, que nos permite criar processos facilmente como este :

GIL

$ python multiprocessing.py
Time taken in seconds - 1.8036038875579834

Tivemos uma melhora incrível na performance !!

Que fique claro que multi-processing são mais 'pesados' que multi-threading. Ou seja, lembre-se que para cada processo, teremos um ambiente Python próprio e isso pode se tornar um gargalo de memoria.

Obrigado por ler até aqui, espero que tenha gostado.


📝 Licença

Esse projeto está sob a licença MIT. Veja o arquivo LICENSE para mais detalhes.


Feito com 💜 by Wellington

Footnotes

  1. Deadlock pode ser traduzido informalmente para Impasse, onde no cenario da Ciência da Computação é usado quando dois ou mais processos ficam impedidos de continuar suas execuções devido um bloqueiar o outro.

About

Explicação do Global Interpreter Lock em Python.

Topics

Resources

License

Stars

Watchers

Forks

Languages