如何在Python中将AutoProxy类型转换为list

我用 manager 共享了一个 list,但在另一个 python 程序获取这个共享却发现它是 AutoProxy 类型,无法进行迭代,要怎么变成 list 呢?
如何在Python中将AutoProxy类型转换为list

6 回复

list(your_obj)


正常情况下 Manager 会对所有经过他传输的对象转化为一个 Proxy 对象,而当你需要传递一个共享的 list 的时候应该调用 manager.list()创建 list,而不是直接发送一个 list 过去。另外 python 的类型并不重要,就算它是个 AutoProxy 类型也应该可以迭代,具体的还要看你的代码才能下结论
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
>>> import multiprocessing
>>> manager = multiprocessing.Manager()
>>> l = manager.list()
>>> l.append(1)
>>> l.append(2)
>>> l.append(3)
>>> type(l)
<class ‘multiprocessing.managers.ListProxy’>
>>> tuple(l)
(1, 2, 3)

又翻了一下 multiprocessing.Manager 的源代码,确定了一下如果你获取到的是 AutoProxy 类型,那么根据它的实现,是不会代理任何_开头的方法的,自然也不会代理__iter__,所以无法迭代,你需要保证你获取到的是一个 ListProxy 对象,也就是你不能直接共享一个 list 过去,一定要用 manager.list()打包一下再共享

再修正一下,对于 list 只需要代理__getitem__即可,并不需要代理__iter__
https://docs.python.org/3/library/functions.html?highlight=iter#iter

naive_list = proxy[:]
反过来也可以 proxy[:] = naive_list

谢谢,后来是在客户端注册时设置了一个 baseproxy 类型,然后迭代时用_getvalue()就行了

回到顶部