2010-05-29 12 views
6

Ho bisogno di condividere un dizionario enorme (circa 1 GB di dimensione) tra più processi, tuttavia dal momento che tutti i processi leggeranno sempre da esso. Non ho bisogno di essere bloccato.Come condividere un dizionario tra più processi in python senza bloccare

C'è un modo per condividere un dizionario senza bloccare?

Il modulo multiprocessing in pitone fornisce una classe Array che permette la condivisione senza bloccaggio modificando
blocco = false
tuttavia v'è alcuna possibilità per Dictionary fornito da gestore nel modulo multiprocessore.

risposta

5

Beh, in effetti il ​​comando di un manager non ha serrature! Immagino sia vero per l'altro oggetto condiviso che puoi creare anche attraverso il gestore. Come lo so? Ho provato:

from multiprocessing import Process, Manager 

def f(d): 
    for i in range(10000): 
     d['blah'] += 1 

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

    d = manager.dict() 
    d['blah'] = 0 
    procs = [ Process(target=f, args=(d,)) for _ in range(10) ] 
    for p in procs: 
     p.start() 
    for p in procs: 
     p.join() 

    print d 

Se c'erano serrature d, il risultato sarebbe 100000. Invece, il risultato è piuttosto casuale e quindi questa è solo una bella illustrazione perché i blocchi sono necessari quando si modificano le cose ;-)

Quindi basta andare avanti e utilizzare manager.dict().

+0

Vedo la condizione di gara: d ['blah'] + = 1 è in realtà d ['blah'] = d ['blah'] + 1 che si rompe per ottenere d ['blah'], aggiungi 1, e poi memorizzare in d ['blah']. In quel momento l'altro processo avrebbe potuto cambiarlo. In questo caso, il manager sta solo fornendo un proxy per accedere al dett. Davvero dovresti usare il gestore per creare anche un blocco tra la lettura e l'aggiunta al ditt. – dalore

Problemi correlati