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'}