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.

• A classe Lock do módulo nativo threading é a implementação-padrão de

travas de exclusão mútua (mutex) no Python.

Item 39: Use Queue para coordenar o trabalho entre

as threads

Os programas em Python que fazem muitas coisas de forma simultânea precisam

coordenar o trabalho. Um dos arranjos mais úteis para implementar concorrência

é com uma pipeline de funções.

Uma pipeline funciona como uma linha de montagem em uma fábrica. As

pipelines têm muitas fases em sequência, cada uma com uma função específica.

Novas tarefas são constantemente adicionadas ao começo da fila. Cada função

pode operar na tarefa que lhe é confiada de forma concorrente às demais threads.

A fila anda à medida que cada função é finalizada até que não haja nenhuma fase

a processar. Essa técnica é especialmente eficiente para trabalho que inclua

bloqueio de I/O ou subprocessos – atividades que podem ser postas em paralelo

facilmente usando Python (consulte o Item 37: “Use threads para bloquear I/O e

evitar paralelismo”).

Por exemplo, digamos que se queira construir um sistema que receba na entrada

uma sequência de imagens de sua câmera digital, redimensione cada uma delas e

as adicione em ordem a um álbum de fotos que esteja na internet. Esse programa

pode ser dividido em três fases dentro de uma pipeline. Novas imagens são

transferidas da câmera na primeira fase. As imagens baixadas são repassadas a

uma função de redimensionamento na segunda fase. As imagens

redimensionadas são consumidas pela função de upload na fase final.

Imagine que já tenhamos escrito funções em Python que executem as três fases:

download, resize, upload. Como montamos uma pipeline para que o trabalho

possa ser feito de forma concorrente?

A primeira coisa a implementar é uma maneira de transferir o trabalho entre uma

fase e outra. Isso pode ser modelado como uma fila produtor-consumidor que

seja segura para as threads (consulte o Item 38: “Use Lock para evitar que as

threads iniciem condições de corrida nos dados” para entender a importância da

segurança de threads no Python. Adicionalmente, consulte o Item 46: “Use

algoritmos e estruturas de dados nativos” para saber mais sobre a classe deque).

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!