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.

Versões mais antigas nos obrigam a usar o módulo nativo select sobre proc.stdin,

proc.stdout e proc.stderr para garantir o cumprimento dos timeouts de I/O.

Lembre-se

• Use o módulo subprocess para executar processos-filho e gerenciar seus

fluxos de entrada e saída.

• Os processos-filho rodam em paralelo com o interpretador do Python,

possibilitando maximizar o uso de CPU.

• Use o parâmetro timeout com communicate para evitar deadlocks e

processos-filho travados (“zumbis”).

Item 37: Use threads para bloquear I/O e evitar

paralelismo

A implementação-padrão do Python é chamada de CPython. O CPython precisa

de duas etapas para executar um programa. Primeiro, analisa o texto-fonte e o

compila em bytecode. Depois, executa esse bytecode usando um interpretador

baseado em pilhas (stack-based interpreter). O interpretador de bytecode possui

estados que precisam ser administrados e coerentes enquanto o programa em

Python está sendo executado. O Python garante a coerência com um mecanismo

chamado de trava global do interpretador (Global Interpreter Lock – GIL).

Essencialmente, a GIL é uma trava mutuamente excludente (mutual-exclusion

lock, ou mutex), cuja função é impedir que o CPython seja afetado pelo recurso

de multitarefa preemptiva do sistema operacional. Nesse tipo de multitarefa, uma

thread toma o controle de um programa interrompendo ativamente a execução de

outra thread. Esse tipo de interrupção pode arruinar os estados do interpretador

se acontecerem em um momento inesperado. A GIL evita essas interrupções e

garante que cada instrução do bytecode funcione corretamente com a

implementação do CPython e seus módulos de extensão desenvolvidos em C.

A GIL tem um efeito colateral negativo muito importante. Nos programas

escritos em linguagens como C++ ou Java, ter múltiplas threads significa que o

programa poderia, pelo menos em tese, utilizar mais de um núcleo de CPU ao

mesmo tempo. Embora o Python suporte a execução de múltiplas threads, a GIL

é um fator limitante que permite o processamento de apenas uma thread por vez.

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!