在此过程中,我无法更改公共 Manager 命名空间中的嵌套列表(=二维矩阵)(因此,信息也不会进入main)。即:在下面的例子中,ns.my_list[1] 没有取列表t的值(我在调试的时候把问题简化到最小,以免把所有的东西都放在这里)。同时,在调试打印中很清楚 ns.my_list[1] 正是一个列表,即 从逻辑上讲,它应该取列表 t 的值。我在 python.readthedocs.io 上仔细阅读了有关代理对象的信息,但没有看到任何相关内容。请提出是什么原因。
from multiprocessing import Process, Manager
def process_work(ns):
t = [1,2,3,4]
ns.my_list[1]=t
print ('type of ns.my_list[1]:', type(ns.my_list[1])) # <class 'list'>
print('ns.my_list[1]', ns.my_list[1]) #ns.my_list[1] [0, 0, 0, 0]
if __name__ == '__main__':
mgr=Manager()
namespace=mgr.Namespace()
namespace.my_list=mgr.list()
namespace.my_list= [[0] * 4] * 3 # матрица 3(l)х4(n)
new_process = Process(target=process_work, args=(namespace,))
new_process.start()
new_process.join()
(使用一个简单的列表 - 一维矩阵,一切正常,一切都通过数组工作,但我希望能够返回多维数组/列表列表,其中每一行都由一个单独的进程处理。你可以使用一个- 通过 Array 的维数组,但我不想像那样限制它 - 一旦被截断的知识是不够的)。
因此,您用常规列表替换
mgr.list()了该字段,因此没有任何效果。namespace.my_list您需要使用mgr.list(),然后一切正常:结论:
或者,如果您想逐步填写此列表,请执行以下操作:
但无论如何,这里最主要的是它
namespace.my_list必须在mgr.list(). 当您分配给列表包含namespace.my_list的结果时,您替换此变量并且它不再存在。mgr.list()