Python使用管理器和字典在进程之间共享列表

时间:2016-10-11 03:52:01

标签: python dictionary multiprocessing

管理器()。dict()似乎在值只是一个值时工作正常,但是当值是列表时则不行。有没有办法使用Manager()来共享进程之间的列表?

from multiprocessing import Process, Manager

def add(c):
    for i in range(1000):
        c['a'][0] += 1
        c['a'][1] += 2

d = Manager().dict()
d['a'] = [0,0]

p = Process(target=add, args=(d,))
p.start()
p.join()

print(d)

输出:

{1: [0, 0]}

解决感谢@Dale Song

看来你必须间接地做一些事情......将值分配给临时列表,然后将临时列表分配给字典,这很奇怪。

from multiprocessing import Process, Array, Manager

def test(dict,m,val):
    for i in range(1000):
        m[0] +=1
        m[1] +=2
        dict[val] = m

if __name__ == '__main__':
    d = Manager().dict()
    l = [0,0]
    d['a'] = l
    p = Process(target=test, args=(d,l,'a'))
    p.start()
    p.join()
    print(d)

输出:

{'a': [1000, 2000]}

另一种(快得多)方式:

使用共享内存和多处理.Array()

from multiprocessing import Process, Manager,Array

d = {}
d['a'] = Array('i', [0,0])


def add_array(c,val):
    for i in range(1000):
        c[val][0] +=1
        c[val][1] +=2

p = Process(target=add_array, args=(d,'a', ))
p.start()
p.join()

print([d['a'][0],d['a'][1]])

输出:

[1000, 2000]

https://docs.python.org/2/library/multiprocessing.html#multiprocessing.Array https://docs.python.org/2/library/array.html #typecodes

0 个答案:

没有答案
相关问题