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.

# Lendo a informação do sensor

# ...

counter.increment(1)

No exemplo de código a seguir, definimos uma função que inicia uma thread de

trabalho para cada sensor e espera que eles terminem suas leituras:

def run_threads(func, how_many, counter):

threads = []

for i in range(5):

args = (i, how_many, counter)

thread = Thread(target=func, args=args)

threads.append(thread)

thread.start()

for thread in threads:

thread.join()

Rodar cinco threads em paralelo parece ser simples e o resultado esperado deve

ser óbvio.

how_many = 10**5

counter = Counter()

run_threads(worker, how_many, counter)

print('Counter should be %d, found %d' %

(5 * how_many, counter.count))

>>>

Counter should be 500000, found 278328

No entanto, o resultado está absurdamente fora do esperado! O que aconteceu

aqui? Como uma coisa tão simples pode ter errado tanto, especialmente porque

apenas uma thread do interpretador Python pode rodar em um dado momento?

O interpretador Python forçosamente impõe o mais perfeito equilíbrio entre

todas as threads sendo executadas para garantir que consumam exatamente o

mesmo tempo de CPU. Para que isso possa ser garantido, o Python suspende

abruptamente uma thread que esteja rodando e passa o controle da CPU para a

próxima da fila. O problema é que não se sabe exatamente quando o Python

suspenderá a thread, que pode inclusive ser pausada bem no meio de uma

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!