2010-05-29 7 views
6

Ich muss ein großes Wörterbuch (ca. 1 GB groß) zwischen mehreren Prozessen teilen, aber alle Prozesse werden immer davon lesen. Ich brauche keine Verriegelung.Wie ein Wörterbuch zwischen mehreren Prozessen in Python ohne Sperre teilen

Gibt es eine Möglichkeit, ein Wörterbuch ohne Sperren zu teilen?

Das Multiprocessing-Modul in Python eine Array-Klasse bereitstellt, die durch das Setzen
Schlosses ohne Sperrfreigabe erlaubt = false
jedoch Es gibt keine solche Option für Wörterbuch von Managern bereitgestellt Modul in Multiprocessing.

Antwort

5

Nun, das Diktat eines Managers hat überhaupt keine Sperren! Ich denke, das gilt auch für das andere gemeinsame Objekt, das Sie auch über den Manager erstellen können. Wie ich das weiß? Ich habe versucht:

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 

Wenn es Schlösser sind auf d, wäre das Ergebnis 100000 sein. Aber stattdessen ist das Ergebnis ziemlich zufällig und so ist dies nur eine schöne Illustration, warum Sperren benötigt werden, wenn Sie Sachen ändern ;-)

Also gehen Sie einfach weiter und verwenden Sie manager.dict().

+0

Ich sehe die Race-Bedingung: d ['blah'] + = 1 ist eigentlich d ['blah'] = d ['blah'] + 1 was zusammenbricht, um d ['blah'] zu erhalten, addiere 1, und dann in d ['blah'] speichern. In dieser Zeit könnte der andere Prozess es verändert haben. Der Manager stellt in diesem Fall nur einen Proxy für den Zugriff auf das Diktat bereit. Eigentlich sollte der Manager auch eine Sperre zwischen dem Lesen und dem Zurücksetzen des Diktats erstellen. – dalore

Verwandte Themen