更改多处理列表

时间:2017-06-26 09:55:19

标签: python list multiprocessing

我最近在Python 2.7中遇到了一个奇怪的行为。

>>> import multiprocessing as mp
>>> lst = mp.Manager().list()
>>> lst.append([1,2])
>>> lst.append([3,4])
>>> print(lst)
[[1, 2], [3, 4]]
>>> lst[0][1] = 123
>>> print(lst)
[[1, 2], [3, 4]]     

咦?为什么多处理列表的第一个元素没有改变?它适用于普通列表!

让我们以不同的方式尝试。

>>> lst[0] = [1,123]
>>> print(lst)
[[1, 123], [3, 4]]

好的,至少我有一个解决方法。但为什么第一个代码段中的分配lst[0][1] = 123不起作用?

1 个答案:

答案 0 :(得分:1)

我已尝试解决您的问题,这就是我遇到的问题:

  

注意对dict和列表代理中的可变值或项的修改不会通过管理器传播,因为代理无法知道何时修改其值或项。要修改此类项,可以将修改后的对象重新分配给容器代理:

感谢this question

所以看起来这不是数据结构本身的问题,而是管理它。所以,我已根据the docs创建了一个流程:

import multiprocessing as mp

def targ(*args, **kwargs):
  print('Args: {}'.format(args[0]))
  args[0][0].pop()
  args[0][0].append(123)
  print('Args: {}'.format(args[0]))

manager = mp.Manager()
lst = manager.list()
lst.append([1, 2])
lst.append([3, 4])

print(lst)

proc = mp.Process(target=targ, args=(lst,))
proc.start()
proc.join()

print(lst)

给我以下结果:

$ python3 main.py 
[[1, 2], [3, 4]]
Args: [[1, 2], [3, 4]]
Args: [[1, 123], [3, 4]]
[[1, 123], [3, 4]]

当我尝试使用args[0][0][1] = 123进行分配时,不会发生任何更改,因此需要一个解决方法或替代方法。