"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como evitar condições de corrida ao compartilhar dicionários em multiprocessamento?

Como evitar condições de corrida ao compartilhar dicionários em multiprocessamento?

Publicado em 2024-12-21
Navegar:192

How to Avoid Race Conditions When Sharing Dictionaries in Multiprocessing?

Como sincronizar o acesso a dicionários compartilhados em multiprocessamento

Em um ambiente de multiprocessamento, vários processos podem exigir acesso a dados compartilhados, como um dicionário. No entanto, se mecanismos de sincronização adequados não forem implementados, condições de corrida podem ocorrer, levando a dados não confiáveis ​​ou corrompidos.

Considere um cenário em que vários processos filhos acessam um dicionário global D enquanto trabalham em uma fila compartilhada Q. Inicialmente, o dicionário parece armazenar os resultados modificados pelos processos filhos. No entanto, uma vez que o processo principal se junta a Q, o dicionário D fica vazio.

Esse problema decorre da natureza assíncrona do multiprocessamento. Cada processo filho tem seu próprio espaço de memória e as modificações feitas em variáveis ​​compartilhadas podem não ser imediatamente visíveis para outros processos sem a sincronização adequada.

Usando um objeto gerenciador para sincronização

Uma solução comum para sincronizar o acesso a dados compartilhados em multiprocessamento é usar um objeto Manager. Um Gerenciador fornece segmentos de memória compartilhada que podem ser acessados ​​por todos os processos participantes.

Veja como você pode implementar a sincronização usando um Gerenciador:

from multiprocessing import Process, Manager

def f(d):
    d[1]  = '1'
    d['2']  = 2

if __name__ == '__main__':
    manager = Manager()

    d = manager.dict()
    d[1] = '1'
    d['2'] = 2

    p1 = Process(target=f, args=(d,))
    p2 = Process(target=f, args=(d,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

    print(d)

Neste exemplo, o objeto Manager cria um dicionário compartilhado d, que é acessível por ambos os processos filhos. Quando um processo filho modifica o dicionário, as alterações ficam imediatamente visíveis para outros processos.

Saída:

$ python mul.py
{1: '111', '2': 6}

Esta saída demonstra que o dicionário compartilhado foi sincronizado e atualizado com sucesso pelos processos filhos.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3