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.

class MyQueue(object):

def __init__(self):

self.items = deque()

self.lock = Lock()

O produto, sua câmera digital, adiciona novas imagens ao fim da lista de itens

pendentes.

def put(self, item):

with self.lock:

self.items.append(item)

O consumidor, a primeira fase de nossa pipeline, remove a imagem que está na

primeira posição de nossa lista de itens pendentes.

def get(self):

with self.lock:

return self.items.popleft()

No exemplo de código a seguir, representamos cada fase da pipeline como uma

thread em Python que aceita trabalho como a partir de uma fila como esta, roda

uma função nele e coloca o resultado em outra fila. Também podemos saber a

qualquer momento quantas vezes a thread de trabalho verificou a fila de entrada

para consultar se havia itens lá, bem como a quantidade de trabalho que já foi

completada.

class Worker(Thread):

def __init__(self, func, in_queue, out_queue):

super().__init__()

self.func = func

self.in_queue = in_queue

self.out_queue = out_queue

self.polled_count = 0

self.work_done = 0

A parte mais crítica é que a thread de trabalho precisa saber o que fazer quando a

fila de entrada estiver vazia porque a fase anterior ainda não tiver completado

seu trabalho. Isso acontece quando a exceção IndexError é capturada, como

demonstrado no exemplo a seguir. Podemos associar essa situação a um gargalo

na linha de montagem.

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!