Python 如何在进程之间共享多维数组?

Python 如何在进程之间共享多维数组?,python,multiprocessing,Python,Multiprocessing,我当前的项目需要使用多个流程。我需要在这些进程之间共享一个数组。阵列需要能够随时写入。数组必须具有多个维度。(例如:[“test”,2],[87209873,“howdy”]])我已经寻找这个问题的答案好几个小时了,但我什么也找不到。请帮忙。提前谢谢 首先,列表不是一个数组,如果您想在不同进程之间共享列表,您可以使用多处理模块中的管理器,例如: 将多处理导入为mp def删除最后一个元素(mp_列表:列表): mp_list.pop() def附加列表(mp列表:列表): mp_list.app

我当前的项目需要使用多个流程。我需要在这些进程之间共享一个数组。阵列需要能够随时写入。数组必须具有多个维度。(例如:[“test”,2],[87209873,“howdy”]])我已经寻找这个问题的答案好几个小时了,但我什么也找不到。请帮忙。提前谢谢

首先,
列表
不是一个
数组
,如果您想在不同进程之间共享
列表
,您可以使用
多处理
模块中的
管理器
,例如:

将多处理导入为mp
def删除最后一个元素(mp_列表:列表):
mp_list.pop()
def附加列表(mp列表:列表):
mp_list.append([12'新Hello']))
如果名称=“\uuuuu main\uuuuuuuu”:
mp_list=mp.Manager().list()
mp_list.append(['Hello']))
打印(“多重处理前:”,mp\U列表)
worker1=mp.Process(target=remove\u last\u元素,args=(mp\u list,)
worker2=mp.Process(target=append\u list,args=(mp\u list,))
worker1.start()
worker2.start()
worker1.join()
worker2.join()
打印(“多重处理后:”,mp\U列表)
>>>在进行多重处理之前:[['Hello']]
>>>多重处理后:[[12,‘新Hello']]
试试看:

来自多处理导入池、管理器的

def辅助程序(v,阵列):
array.append([“test”,v])
def main():
foo=[[“测试”,2],[87209873,“你好”]]
array=Manager().list(foo)
将池(进程=4)作为池:
starmap(worker,[(i,数组)
对于范围(4)]中的i)
打印(数组)
如果名称=“\uuuuu main\uuuuuuuu”:
main()
[已编辑]

如果需要,请确保主程序在计算期间保持运行,将池封装在单独的线程中:

来自多处理导入池、管理器的

从线程导入线程
def_工作者(v,阵列):
对于范围(10000)内的i:
array.append([“test”,v])
def处理器(阵列):
将池(进程=4)作为池:
starmap(_worker,[(i,数组)
对于范围(4)]中的i)
def main():
foo=[[“测试”,2],[87209873,“你好”]]
array=Manager().list(foo)
t=线程(目标=处理器,参数=(数组,))
t、 开始()
打印(“你好!”)
#等待,线程正在结束。
#不这样做,您将打印数组,
#不知道线程何时结束。
t、 加入
打印(数组)
如果名称=“\uuuuu main\uuuuuuuu”:
main()

是的,使用多处理模块。您可以查看。这是否回答了您的问题?不完全是。我只需要一个简单的解释。我已经研究过如何使用“Array()”,但我不确定如何将其用于2D数组。1)我认为在共享内存中,可能无法增长数组;它与其他Python类型完全不同。2) 要在数组中获得2维,请执行一些受C编译器所做工作启发的操作:linear_index=two_d.row*10+two_d.column。3) 如果你能使用a,那可能是个不错的选择。我以前用过这个方法,但由于一些奇怪的原因,它不允许我附加到列表中。例如,我不能执行“testList[1]。追加(“hello”)”,它什么也不做。如果我不使用管理器,则附加功能可以正常工作。@wimpylama您到底不能做什么?来自多处理导入*test=manager().list()test.append([“test”,“data”])test[0]。append(“很酷”)#这段代码根本不起作用。你自己试试看,你会发现问题在于它会暂停程序。我需要主程序像其他几个在后台运行的程序一样继续运行。现在我得到“[WinError 10053]一个已建立的连接被主机上的软件中止了”不确定原因或这意味着什么。我已经得到了错误的答案,但列表仍然没有在进程中传播。@Wimpylama,是的,完全正确-我忘了使用等待线程结束的
t.join()
。无法检查VS.Hm上的代码。。。奇怪的是,你犯了错误。不要认为它与代码有关。。。