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.

Consumer waiting

Producer putting

Consumer done

Producer done

Para resolver o problema de gargalo na pipeline, a classe Queue permite que se

especifique o tamanho máximo de trabalho pendente entre duas fases. Esse

tamanho de buffer faz com que as chamadas a put bloqueiem a fila quando ela já

estiver cheia. Por exemplo, o código a seguir define uma thread que espera um

momentinho antes de consumir o próximo item da fila.

queue = Queue(1) # Tamanho do buffer = 1

def consumer():

time.sleep(0.1) # Espera

queue.get() # Segunda a ser executada

print('Consumer got 1')

queue.get() # Quarta a ser executada

print('Consumer got 2')

thread = Thread(target=consumer)

thread.start()

A espera deve permitir que a thread produtora ponha um segundo objeto na fila

(com put) antes que a thread consume tenha oportunidade de chamar a função

get. O tamanho de Queue, aqui, é 1, o que significa que o produtor sempre terá

que esperar a thread consumidora chamar a função get ao menos uma vez para

que a segunda chamada a put pare de bloquear seu próprio processamento e

adicione um segundo item à fila.

queue.put(object())

print('Producer put 1')

queue.put(object())

print('Producer put 2')

thread.join()

print('Producer done')

>>>

# Roda primeiro

# Terceira a ser executada

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!