我正试图在Python中的多处理中使用manager来跨进程共享列表(以及其他内容(。似乎更改列表中值的唯一方法是显式更改,即list1[2]=list2[2]。如果列表很长或很复杂,这会有点痛苦。我只想说list1=list2,其中list1是由管理器控制的共享对象,list2是工作进程中的列表。它会让我附加到list1(所以它不必是固定长度(,但它不会让我清除list1,所以list1.clear((list1.append(list2(不会起作用。有人对此有简单的解决方案吗?
ISTR管理器速度较慢,在较新版本的Python中不太需要。
您可以使用多处理将int数组放入共享内存中。这很可能就是你想要的——至少如果你的";列表";包含简单类型。
发件人https://docs.python.org/3/library/multiprocessing.html:
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[:])
从那里开始,尝试切片分配。我不知道这是否可行,但这是一件值得尝试的事情。
不过,我倾向于使用队列。它们提供了松散的耦合,并且可以更好地处理更复杂的类型。例如:to_network_queue: multiprocessing.Queue = multiprocessing.Queue(maxsize=max_messages)
此外,多处理不如concurrent.futures,后者封装了多处理和线程,并允许通过单行更改在进程和线程之间切换。
以下是我所说的";切片分配":
$ /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])
>>>
如果这应该是一条评论,很抱歉-评论的长度似乎非常有限。所以我尝试了Array(我目前正在使用的(,但sllcing不起作用。我还是得一个条目一个条目地把事情拼凑起来。此外,输入是一个列表列表(即2D数组(,我不清楚如何让array与2D数组一起工作,至少在日常工作中是这样。
我曾考虑过队列,但生产者创建数据的速度远远快于消费者获取数据的速度,而且消费者只想要最新的数据,所以我选择了Arrays,因为这样我就覆盖了旧数据。然而,我想我可以让消费者弹出最新数据,然后清空队列(?(。这是有可能的。
我不知道同意。未来,所以必须看看