2017-08-28 3 views
0

Je voudrais être en mesure de créer un nouveau multiprocessing.Value ou multiprocessing.Array après le début du processus. Comme dans cet exemple:Déclarer la mémoire partagée après le début du processus

# coding: utf-8 
import multiprocessing 

shared = { 
    'foo': multiprocessing.Value('i', 42), 
} 


def job(pipe): 
    while True: 
     shared_key = pipe.recv() 
     print(shared[shared_key].value) 

process_read_pipe, process_write_pipe = multiprocessing.Pipe(duplex=False) 

process = multiprocessing.Process(
    target=job, 
    args=(process_read_pipe,) 
) 
process.start() 

process_write_pipe.send('foo') 

shared['bar'] = multiprocessing.Value('i', 24) 
process_write_pipe.send('bar') 

Ouput:

42 
Process Process-1: 
Traceback (most recent call last): 
    File "/usr/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap 
    self.run() 
    File "/usr/lib/python3.5/multiprocessing/process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
    File "/home/bux/Projets/synergine2/p.py", line 12, in job 
    print(shared[shared_key].value) 
KeyError: 'bar' 

Process finished with exit code 0 

Le problème est ici: shared dict est copié dans process quand il commence. Mais, si j'ajoute une clé dans shared dict, le processus ne peut pas le voir. Comment cela a commencé process peut être informé de l'existence de nouveaux multiprocessing.Value('i', 24)?

Il ne peut être donné la pensée conduite parce que:

objets Synchronisé ne devraient être partagés entre les processus par héritage

Toute idée?

Répondre

0

Il semble que vous supposiez que la variable shared est accessible par les deux threads. Seule la variable ["foo"] partagée est accessible par les deux threads. Vous devez partager un dictionnaire.

Voici un exemple: Python multiprocessing: How do I share a dict among multiple processes?

+0

réponse est correcte mais je me suis problème de performance: manager.dict() faire le travail, mais les données sont décapés. Les processus ne sont pas seulement informés des nouveaux blocs partagés de mémoire. – bux