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.

while len(done_queue.items) < 1000:

# Alguma coisa útil é feita aqui, enquanto esperamos...

# ...

Tudo roda como esperado, mas há um efeito colateral interessante, causado pelas

constantes verificações das threads às filas de entrada de cada uma. A parte

crítica, quando capturamos as exceções IndexError no método run, é executada

um número excessivo de vezes.

processed = len(done_queue.items)

polled = sum(t.polled_count for t in threads)

print('Processed', processed, 'items after polling',

polled, 'times')

>>>

Processed 1000 items after polling 3030 times

Quando as velocidades das funções de trabalho variam entre si, uma fase

anterior pode impedir que a pipeline avance em fases posteriores, gerando um

gargalo. Com isso, os processos mais adiante na pipeline vão, às vezes, ficar sem

nenhum trabalho para fazer e constantemente verificarão suas filas de entrada

em busca de mais trabalho a fazer. Como resultado, as threads de trabalho

desperdiçam tempo de CPU com tarefas inúteis (constantemente elevando e

subsequentemente capturando exceções IndexError).

No entanto, esse é só o começo do que está errado com essa implementação. Há

três outros problemas que precisamos evitar. Primeiro, a ação de determinar que

todo o trabalho na entrada já foi processado requer um ciclo de espera adicional

(busy wait) na fila done_queue. Segundo, na classe Worker o método run (que

ocupa muitos recursos do sistema) está sendo executado num laço infinito. Não

há maneira de sinalizar a uma thread de trabalho que é hora de encerrar o

expediente.

Terceiro, e pior de todos, um atraso na pipeline pode fazer o programa travar

arbitrariamente. Se a primeira avançar rapidamente sobre sua fila de entrada,

mas a segunda fase for bem mais lenta, a fila conectando a primeira e a segunda

fase crescerá de tamanho indefinidamente. A segunda fase não será capaz de

aguentar por muito tempo. Dê ao programa tempo suficiente e dados de entrada

em fluxo constante, e chegará um momento em que a memória disponível para o

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!