在python中跨进程共享数据

在python中跨进程共享数据,python,multiprocessing,Python,Multiprocessing,我试图在Python的多处理中使用manager来跨进程共享一个列表(以及其他内容)。似乎更改列表中的值的唯一方法是显式执行,即list1[2]=list2[2]。如果列表很长或很复杂,这会有点痛苦。我只想说list1=list2,其中list1是由manager控制的共享对象,list2是工作进程中的列表。它将允许我附加到列表1(因此它不必是固定长度的),但它不允许我如此清除列表1 清单1.clear() list1.append(list2) 不行。有人对此有简单的解决方案吗?ISTR管理器

我试图在Python的多处理中使用manager来跨进程共享一个列表(以及其他内容)。似乎更改列表中的值的唯一方法是显式执行,即list1[2]=list2[2]。如果列表很长或很复杂,这会有点痛苦。我只想说list1=list2,其中list1是由manager控制的共享对象,list2是工作进程中的列表。它将允许我附加到列表1(因此它不必是固定长度的),但它不允许我如此清除列表1 清单1.clear() list1.append(list2)
不行。有人对此有简单的解决方案吗?

ISTR管理器速度慢,在较新版本的Python中不太需要

可以使用多处理将int数组放入共享内存中。这很可能就是你想要的——至少如果你的“列表”包含简单类型的话

发件人:

从那里开始,尝试切片分配。我不知道这是否行得通,但这是值得尝试的

不过我倾向于使用队列。它们提供了松散耦合,可以更好地处理更复杂的类型。例如:
到网络队列:多处理。队列=多处理。队列(最大大小=最大消息)

此外,多处理不如concurrent.futures好,它包装了多处理和线程,并允许在进程和线程之间切换,只需一行更改


以下是我所说的“切片作业”的意思:


抱歉,如果这是一个评论-评论的长度似乎非常有限。 所以我尝试了Array(我目前使用的)但sllcing不起作用。我还得把东西一条一条地放在一起。此外,输入是一个列表列表(即2D数组),我不清楚如何让数组与2D数组一起工作,至少是很简单

我曾想过队列,但生产者创建数据的速度远远快于消费者获取数据的速度,消费者只需要最新的数据,所以我使用了数组,因为这样我就覆盖了旧数据。但是,我想我可以让消费者弹出最新数据,然后清除队列(?)。这是可能的


我没有意识到concurrent.futures,所以我必须看看它

,所以我尝试了数组,但sllcing不起作用。我还得把东西一条一条地放在一起。此外,输入是一个列表列表(即2D数组),我不知道如何让数组与2D数组一起工作,至少是很简单。如果你想将2D数组打包成一维数组,你可以像C编译器那样做:用一个坐标乘以一个维的大小,再加上另一个坐标。这有点混乱,所以最好将逻辑放入函数或方法中。
from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])
$ /usr/local/cpython-3.9/bin/python3
below cmd output started 2020 Fri Oct 23 10:26:41 AM PDT
Python 3.9.0 (default, Oct 14 2020, 16:19:47) 
[GCC 7.5.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import array
>>> a = array.array('i', range(10))
>>> a
array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> b = array.array('i', range(5, 15))
>>> b
array('i', [5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>> a[:] = b[:]
>>> a
array('i', [5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
>>>