Ich versuche, einen Schlüssel in einem verschachtelten Wörterbuch des multiprocessing Modul manager.dict() zu aktualisieren, aber nicht in der Lage, dies zu tun. Es aktualisiert den Wert nicht und wirft auch keinen Fehler.Fehler beim Aktualisieren des geschachtelten Wörterbuchwerts in Multiprocessing manager.dict()
Code:
import time
import random
from multiprocessing import Pool, Manager
def spammer_task(d, token, repeat):
success = 0
fail = 0
while success+fail<repeat:
time.sleep(random.random()*2.0)
if (random.random()*100)>98.0:
fail+=1
else:
success+=1
d[token] = {
'status': 'ongoing',
'fail': fail,
'success': success,
'repeat': repeat
}
print d[token]['status']
d[token]['status'] = 'complete'
return
p = Pool()
m = Manager()
d = m.dict()
p.apply_async(spammer_task (d, 'abc', 5))
print d
Ausgang:
laufenden
{ 'abc': { 'Status': 'laufende', 'fail': 0, 'Wiederholung': 5, 'Erfolg': 5}}
Meine Erwartungen sind, dass, sobald while-Schleife endet, sollte es d [ 'abc'] [ 'Status'] = machen com plete. Beim letzten Druck wird jedoch nur der Status 'fortlaufend' ausgegeben.
Danke, keine andere Lösung, die unter Verwendung von zusätzlichen Speichern? Ich werde diesen Multiprozessor innerhalb eines HTTP-Servers deamonisieren und habe nicht das Gefühl, zusätzlichen Speicher + Bereinigung für sie zu behandeln. – MohitC
Laut dem Hinweis unter diesem Teil der Dokumentation: https://docs.python.org/2/library/multiprocessing.html#using-a-remote-manager - scheint das oben vorgeschlagene Verfahren zu sein. – domoarrigato
Die Nachricht, die @domoarrigato gepostet hat, ist veraltet - aber es ist wahr, dass die offizielle Python-Dokumentation diese Antwort als richtig angibt. Hier ist der neue Link - scrollen Sie nach unten, um die Notiz zu finden: https://docs.python.org/2/library/multiprocessing.html#managers –