【问题标题】:Altering multiprocessing lists更改多处理列表
【发布时间】:2017-06-26 09:55:19
【问题描述】:

我最近在 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]]

好的,所以至少我有一个解决方法。但是为什么第一个 sn-p 中的分配 lst[0][1] = 123 不起作用?

【问题讨论】:

    标签: python list multiprocessing


    【解决方案1】:

    我已尝试解决您的问题,以下是我遇到的情况:

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

    感谢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 时没有发生任何变化,因此需要一种解决方法或其他方法。

    【讨论】:

    • 现在想起来很有道理。谢谢!
    猜你喜欢
    • 2012-12-18
    • 2012-07-11
    • 2020-02-20
    • 2021-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-21
    • 2018-08-18
    相关资源
    最近更新 更多