Um programa que cria vários processos que funcionam em uma fila que pode ser juntada, Q
pode ser juntada e pode, eventualmente, manipular um dicionário global D
para armazenar os resultados. (assim, cada processo filho pode usar D
para armazenar seu resultado e também ver quais resultados os outros processos filho estão produzindo)
Se eu imprimir o dicionário D em um processo filho, vejo as modificações que foram feitas nele (ou seja, em D). Mas depois que o processo principal une Q, se eu imprimir D, é um dict vazio!
Eu entendo que é um problema de sincronização / bloqueio. Alguém pode me dizer o que está acontecendo aqui e como posso sincronizar o acesso ao D?
Respostas:
Uma resposta geral envolve o uso de um
Manager
objeto. Adaptado dos documentos:Resultado:
fonte
multiprocessing.Manager()
retorna uma instância deSyncManager
, cujo nome sugere tanto!Manager
mas ainda não tive sorte. Você poderia dar uma olhada na minha pergunta aqui e ver se você pode oferecer uma solução? Ainda posso obter números aleatórios diferentes se fizer issonp.random.seed(None)
toda vez que gerar um número aleatório, mas isso não me permite usar o estado aleatório do processo pai, que não é o que desejo. Qualquer ajuda é muito apreciada.multiprocessamento não é como threading. Cada processo filho receberá uma cópia da memória do processo principal. Geralmente o estado é compartilhado por meio de comunicação (tubos / soquetes), sinais ou memória compartilhada.
O multiprocessamento disponibiliza algumas abstrações para o seu caso de uso - estado compartilhado que é tratado como local pelo uso de proxies ou memória compartilhada: http://docs.python.org/library/multiprocessing.html#sharing-state-between-processes
Seções relevantes:
fonte
Eu gostaria de compartilhar meu próprio trabalho, que é mais rápido que o dict do Manager e é mais simples e estável do que a biblioteca pyshmht que usa toneladas de memória e não funciona no Mac OS. Embora meu dict funcione apenas para strings simples e seja imutável atualmente. Eu uso a implementação de teste linear e armazeno chaves e pares de valores em um bloco de memória separado após a tabela.
No meu laptop, os resultados de desempenho são:
exemplo de uso simples:
fonte
Além de @senderle aqui, alguns também podem estar se perguntando como usar a funcionalidade do
multiprocessing.Pool
.O bom é que existe um
.Pool()
método para amanager
instância que imita todas as APIs familiares de nível superiormultiprocessing
.Resultado:
Este é um exemplo ligeiramente diferente em que cada processo apenas registra seu ID de processo no
DictProxy
objeto globald
.fonte
Talvez você possa tentar pyshmht , que compartilha uma extensão de tabela de hash baseada em memória para Python.
Aviso prévio
Não foi totalmente testado, apenas para sua referência.
Atualmente carece de mecanismos de bloqueio / sem para multiprocessamento.
fonte