管理器()。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