Sincronização e Comunicação
Deslize para mostrar o menu
Ao trabalhar com threads ou processos, muitas vezes é necessário compartilhar dados ou coordenar suas ações. Sem a sincronização adequada, duas threads podem tentar atualizar a mesma variável ao mesmo tempo, levando a resultados imprevisíveis conhecidos como condições de corrida. Para evitar isso, o Python fornece primitivas de sincronização como locks, filas e memória compartilhada.
Um lock é um mecanismo simples que garante que apenas uma thread possa acessar um trecho de código ou dado por vez. Se uma thread adquire um lock, outras threads que tentarem adquiri-lo terão que esperar até que ele seja liberado. Isso impede que múltiplas threads façam alterações conflitantes.
Filas são outra ferramenta poderosa para comunicação segura entre threads e processos. Uma fila permite que uma thread ou processo insira dados com segurança, enquanto outro retira. A classe queue.Queue (para threads) e multiprocessing.Queue (para processos) gerenciam todo o bloqueio necessário internamente, então você não precisa se preocupar com condições de corrida.
Com memória compartilhada, os processos podem acessar os mesmos dados diretamente, mas é necessário usar primitivas de sincronização como locks ou semáforos para evitar conflitos. Na maioria dos casos, o uso de filas é mais simples e seguro para comunicação entre processos.
O vídeo acima mostra como um lock pode evitar que duas threads corrompam dados compartilhados e como uma fila pode ser usada para transferir dados com segurança entre tarefas concorrentes.
1234567891011121314151617181920212223import threading counter = 0 lock = threading.Lock() def increment(): global counter for _ in range(10000): with lock: # Ensuring only one thread enters this block at a time counter += 1 threads = [] for _ in range(5): t = threading.Thread(target=increment) threads.append(t) t.start() for t in threads: t.join() print("Final counter value:", counter) # Without the lock, the final value would likely be wrong due to race conditions. # With the lock, the result is always correct: 50000.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo