1

A managers.dict() ermöglichen, ein Wörterbuch über den Prozess hinweg zu teilen und thread-sicheren Betrieb durchzuführen. In meinem Fall erstellt jeder ein Koordinator-Prozess das gemeinsame dict mit m Elemente und n Worker-Prozesse lesen und schreiben zu/von einem einzelnen dict-Schlüssel.Wie python manager.dict() Sperren funktioniert:

Haben managers.dict() eine einzige Sperre für die dict oder m Sperren, eine für jeden Schlüssel darin?

Gibt es eine alternative Möglichkeit, m Elemente an n Arbeiter zu verteilen, außer einem gemeinsamen Diktat, wenn die Arbeiter nicht miteinander kommunizieren müssen?

Verwandte python-manager-dict-is-very-slow-compared-to-regular-dict

Antwort

1

Nach einigen Versuchen ich sagen kann, nur eine Sperre pro Manager dict ist. Hier ist der Code, der es beweist:

import time 
import multiprocessing as mp 


def process_f(key, shared_dict): 
     values = [i for i in range(64 * 1024 * 1024)] 
     print "Writing {}...".format(key) 
     a = time.time() 
     shared_dict[key] = values 
     b = time.time() 
     print "released {} in {}ms".format(key, (b-a)*1000) 


def main(): 
    process_manager = mp.Manager() 
    n = 5 
    keys = [i for i in range(n)] 
    shared_dict = process_manager.dict({i: i * i for i in keys}) 

    pool = mp.Pool(processes=n) 

    for i in range(n): 
     pool.apply_async(process_f, (keys[i], shared_dict)) 
    time.sleep(20) 


if __name__ == '__main__': 
    main() 

Ausgang:

Writing 4... 
Writing 3... 
Writing 1... 
Writing 2... 
Writing 0... 
released 4 in 3542.7968502ms 
released 0 in 4416.22900963ms 
released 1 in 6247.48706818ms 
released 2 in 7926.97191238ms 
released 3 in 9973.71196747ms 

Process finished with exit code 0 

Die zunehmende Zeit zum Schreiben zeigt die Warte das geschieht.