multiprocessing.Manager (). dict () не может обновить значение второго уровня - PullRequest
1 голос
/ 11 ноября 2019

У меня есть dict x, формат: x_dic = {0: {'length': 2, 'current': 0}}, но когда я использую Manager (). Dict (), чтобы передать x_dic дочернему процессу,я обнаружил, что значение в 'current' не может быть обновлено дочерним процессом.

method 1: 
dic[i]['current'] += 1

method 2:
current_val = dic[i]['current']
current_val += 1
dic[i]['current'] = current_val
if __name__ == '__main__':
    # set config of logger
    print("{}:{}:{}".format(time.localtime().tm_hour, 
          time.localtime().tm_min, time.localtime().tm_sec))
    print(os.getpid())

    # set parameter
    lock = multiprocessing.Lock()
    pool = multiprocessing.Pool(processes=2, initializer=start_process)

    # set test dic 
    testdic = multiprocessing.Manager().dict()
    x = {0:{'length':2,'current':0}}
    testdic.update(x)

    # before multi
    print('now value testdic',dict(testdic))

    # running
    partialmulti = partial(multi_core, testdic=testdic)
    for i, _ in enumerate(pool.imap_unordered(partialmulti,[0,0,0])):
        print('finish process: ',i)

    pool.close()
    pool.join()

    # after multiprocessing
    print('after multi',dict(testdic))

    pool.terminate()

Ответы [ 2 ]

0 голосов
/ 16 ноября 2019

когда передать dict dict в Manager (). Dict (), python dict как второй уровень не изменится. Решением является передача пыльника Manager (). Dict () в качестве второго уровня. Например:

valuedic = multiprocessing.Manager().dict()
valuedic.update({'length':0,'current':1})

x = {0:valuedic}
testdic.update(x)

, тогда значение переменной будет успешно изменено после многопроцессорной обработки.

0 голосов
/ 12 ноября 2019

Вы можете попробовать с многопроцессорностью. Процесс ()

import multiprocessing as mp

m=mp.Manager()
x_dict=m.dict({0:{'length':2,'current':0}})

procs=[]
no_of_processes=2
for i in range(no_of_processes):
    p=mp.Process(target=func_name, args=(x_dict,)) #func_name takes one argument as x_dict and does all the manupulations as required
    p.start()
    procs.append(p)  #Just creating a pointer to the current process and storing in a list

for proc in procs:
    proc.join()

print(x_dict)
...