Introdução a Threads e como implementá-las em Python
Parte 4: Coordenando threads concorrentes
Primeiro criamos o objeto:
trava = Lock()
Há dois métodos que podemos usar:
- trava.acquire() -- Com esse método a Thread que invocou agora "carregará" essa trava
- trava.release() -- A Thread agora "solta" a trava
Se a Thread A carrega a trava X, e a Thread B tenta chamar o método acquire() desta trava, B congelará sua atividade até que seja possível carregar essa trava, ou seja, quando a Thread A chamar o método release() de X.
Por exemplo, para impedir que uma Thread B acesse a variável X enquanto Thread A a modifica, basta Thread A fazer o seguinte:
x = 0 trava.acquire() x = 30 trava.release()
Desta forma, toda Thread concorrente que tentar modificar a variável x enquanto A carrega uma trava, congelará, voltando a sua atividade uma vez que esta trava esteja disponível.
Concluindo: locks servem para congelar threads que tentam obter travas previamente adquiridas por uma thread concorrente.
Indo além
Visto os conceitos básicos da programação multithread, para o leitor que desejar ir além, recomendo o estudo dos seguintes tópicos:- Outras formas de coordenação de threads: Semáforos, Events, Rlocks.
- Módulo multiprocessing, que irá fornecer outro método de implementar diversas funções em um único programa, porém sem o uso de threads.
- Se estiver usando Linux, o uso do fork para clonagem de processos, usando a biblioteca 'os'.
Espero que tenham conseguido aprender com esse artigo, até a próxima.