15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

coisas ao mesmo tempo. Implementar você mesmo um subsistema próprio para

administrar tarefas simultâneas é como aquele número de circo em que o artista

equilibra sozinho vários pratos sobre palitos (consulte o Item 40: “Considere

usar corrotinas para rodar muitas funções simultaneamente” para ver um

exemplo). Com threads, deixamos para o Python o gerenciamento de nossas

funções, que assim dão a impressão de rodar em paralelo. Isso funciona porque o

CPython garante um certo equilíbrio entre as threads sendo executadas, mesmo

que apenas uma delas esteja realmente sendo processada num dado momento,

por conta da GIL.

A segunda razão pela qual o Python suporta threads é gerenciar o bloqueio de

I/O, que acontece quando o Python faz certos tipos de chamada ao sistema. As

chamadas de sistema são como o programa em Python pede ao sistema

operacional para interagir com o mundo externo. Os bloqueios de I/O incluem

coisas como ler e escrever em arquivos, interação com redes, comunicação com

dispositivos como monitores etc. As threads ajudam a lidar com os bloqueios de

I/O porque isolam o programa, fazendo com que não seja afetado pelo tempo

que o sistema operacional perde para responder aos seus pedidos.

Por exemplo, digamos que se queira enviar comandos para um helicóptero

radiocontrolado. A comunicação com o controle remoto é pela porta serial.

Usaremos uma chamada de sistema bastante lenta (select) para simular essa

atividade, pois não temos um helicóptero como esse por aqui. A função pede ao

sistema operacional que crie um bloqueio que dura 0,1 segundo, e depois desse

tempo retorna o controle para o nosso programa, de forma semelhante ao que

aconteceria se estivéssemos usando uma porta serial síncrona.

import select

def slow_systemcall():

select.select([], [], [], 0.1)

Executar essa chamada de sistema requer uma quantidade de tempo que cresce

linearmente.

start = time()

for _ in range(5):

slow_systemcall()

end = time()

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!