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.

Usando uma mutex (ou seja, uma trava), podemos fazer com que a classe

Counter proteja seu valor atual contra acesso simultâneo de múltiplas threads.

Apenas uma thread terá a posse da trava em um dado momento. No exemplo de

código a seguir, usamos um comando with para obter a mutex e posteriormente

liberá-la. Dessa forma, fica fácil determinar qual código está sendo executado

enquanto a trava existir (consulte o Item 43: “Considere os comandos contextlib

e with para um comportamento reutilizável de try/finally” para mais

informações):

class LockingCounter(object):

def __init__(self):

self.lock = Lock()

self.count = 0

def increment(self, offset):

with self.lock:

self.count += offset

Agora, ao executar as threads de trabalho como antes, mas usando

LockingCounter, temos:

counter = LockingCounter()

run_threads(worker, how_many, counter)

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

(5 * how_many, counter.count))

>>>

Counter should be 500000, found 500000

O resultado é exatamente o esperado. A classe Lock resolveu a parada.

Lembre-se

• Mesmo que o interpretador do Python tenha uma trava global, ainda é

responsabilidade do programador proteger seu código contra condições de

corridas nos dados provocadas pelas threads do programa.

• Os programas corromperão suas próprias estruturas de dados se for permitido

que mais de uma thread modifique o mesmo objeto sem que haja travas de

proteção.

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!