2

我想更新多处理模块的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 

输出:

持续

{ 'ABC':{ '地位': '正在进行', '失败':0, '重复': 5, '成功':5}}

我的期望是,一旦while循环结束,应该使d [ 'ABC'] [ '状态'] = COM plete。但是在最终的印刷品上,它仅将其状态显示为“正在进行中”。

回答

3

不知道为什么,但经理DictProxy对象似乎不能处理突变嵌套部分。此代码的工作:

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'] 
    foo = d[token] 
    foo['status'] = 'complete' 
    d[token] = foo 
    return 

p = Pool() 
m = Manager() 
d = m.dict() 

p.apply_async(spammer_task(d, 'abc', 5)) 
print d 
+0

谢谢,没有其他解决方案使用额外的内存? 我打算在HTTP服务器内对这个多处理器进行deamonize处理,并且不想为它们处理额外的内存+清理。 – MohitC

+0

根据这部分文档中的注释:https://docs.python.org/2/library/multiprocessing.html#using-a-remote-manager - 上述似乎是建议的方式来做到这一点。 – domoarrigato

+0

@domoarrigato发布的说明已过期 - 但的确,官方的Python文档声明此答案是正确的。这里是新的链接 - 向下滚动以找到'Note':https://docs.python.org/2/library/multiprocessing.html#managers –

0

貌似这个问题仍然按照以下代码:

import multiprocessing, sys; 

if __name__ == '__main__': 

print(sys.version); 

mpd = multiprocessing.Manager().dict(); 
mpd['prcss'] = {'q' : 'queue_1', 'ctlg' : 'ctlg_1' }; 

# update 1 - doesn't work! 
mpd['prcss'].update({ 'name': 'concfun_1'}); 
print('Result of failed update 1:', mpd['prcss']); 

# update 2 - doesn't work! 
mpd['prcss']['name'] = 'concfun_1'; 
print('Result of failed update 2:', mpd['prcss']); 

# update 3 - works! 
mpd_prcss = mpd['prcss']; 
mpd_prcss['name'] = 'concfun_1'; 
mpd['prcss'] = mpd_prcss; 
print('Result of successful update 3:', mpd['prcss']); 

输出:

3.6.1(v3.6.1:69c0db5,03月21日2017,17:54:52)[MSC v.1900 32 bit(Intel)]

更新失败的结果1:{'q': 'queue_1', 'CTLG': 'ctlg_1'}失败的更新2的

结果:{ 'Q': 'queue_1', 'CTLG': 'ctlg_1'}成功更新3的

结果:{ 'q':'queue_1','ctlg':'ctlg_1', 'name':'concfun_1'}