15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

for thread in threads:

thread.join()

end = time()

print('Took %.3f seconds' % (end - start))

>>>

Took 0.102 seconds

O tempo do processamento paralelo é 5× mais rápido que o tempo gasto para

resolver os cálculos de forma serial. Isso mostra que as chamadas de sistema

rodarão em paralelo para múltiplas threads do Python mesmo estando limitados

pela GIL. A GIL impede que meu código em Python rode em paralelo, mas não

tem impacto negativo nenhum sobre as chamadas de sistema. Isso funciona

porque as threads em Python liberam a GIL logo antes de fazer chamadas de

sistema e rearma a GIL tão logo as chamadas de sistema tenham terminado.

Existem muitas outras maneiras de lidar com operações que bloqueiam I/O além

das threads, como o módulo nativo asyncio. Essas alternativas trazem benefícios

muito importantes. Contudo, essas opções requerem trabalho extra para refatorar

o código de forma a funcionar em um modelo diferente de execução (consulte o

Item 40: “Considere usar corrotinas para rodar muitas funções

simultaneamente”). Usar threads é o meio mais simples de executar operações

que bloqueiam I/O em paralelo, com um mínimo de alterações no programa

principal.

Lembre-se

• As threads do Python não conseguem rodar bytecode em paralelo nos

sistemas com mais de um núcleo de CPU por conta da global interpreter lock

(GIL).

• Mesmo com a GIL, as threads do Python são bastante úteis porque oferecem

uma maneira bem fácil de executar múltiplas tarefas ao mesmo tempo.

• Use as threads do Python para fazer múltiplas chamadas de sistema em

paralelo. Com isso, podemos disparar operações que bloqueiam I/O ao

mesmo tempo em que o programa principal continua computando outras

coisas.

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!