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.

Consumer waiting

Producer waiting

Consumer working

Consumer done

Producer done

Podemos colocar todos esses comportamentos juntos em uma subclasse de

Queue que também diz à thread de trabalho o momento em que deve parar de

processar. No exemplo de código a seguir, eu defino um método close que

adiciona um item especial à fila de entrada, indicando que não haverá mais itens

a processar depois dele:

class ClosableQueue(Queue):

SENTINEL = object()

def close(self):

self.put(self.SENTINEL)

Depois, definimos um iterador para a fila que procura por esse objeto especial e

interrompe a iteração quando o encontra. Esse método __iter__ também chama

task_done nos momentos oportunos, permitindo que o programador possa

acompanhar o avanço no processamento da fila.

def __iter__(self):

while True:

item = self.get()

try:

if item is self.SENTINEL:

return # Obriga a thread a encerrar-se

yield item

finally:

self.task_done()

Em seguida, podemos redefinir a thread de trabalho para se apoiar no

comportamento da classe ClosableQueue. A thread será encerrada após a

exaustão do laço.

class StoppableWorker(Thread):

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

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!