Я пытаюсь обновить ключ во вложенном словаре менеджера мультипроцессорного модуля manager.dict(), но не в состоянии это сделать. Он не обновляет значение и не вызывает никакой ошибки.Невозможно обновить значение вложенного словаря в диспетчере multiprocessing manager.dict()
Код:
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
Выход:
продолжается
{ 'а': { 'статус': 'продолжается', 'провал': 0, 'повтор': 5, 'success': 5}}
Мои ожидания заключаются в том, что как только цикл цикла завершится, он должен сделать d ['abc'] ['status'] = com plete. Но при окончательной печати он печатает свой статус только «продолжающийся».
Спасибо, никакое другое решение, используя дополнительную память? Я собираюсь деамонизировать этот многопроцессор внутри HTTP-сервера и не хочу обрабатывать дополнительную память + очистку для них. – MohitC
Согласно примечанию в этой части документа: https://docs.python.org/2/library/multiprocessing.html#using-a-remote-manager - вышеизложенное представляется предлагаемым способом для этого. – domoarrigato
Заметка, опубликованная @domoarrigato, устарела, но это правда, что официальная документация на Python утверждает, что этот ответ является правильным. Вот новая ссылка - прокрутите вниз чуть-чуть, чтобы найти «Примечание»: https://docs.python.org/2/library/multiprocessing.html#managers –