如何把 AutoProxy 类型转换成 list

2019-05-07 07:27:05 +08:00
 wakan190
我用 manager 共享了一个 list,但在另一个 python 程序获取这个共享却发现它是 AutoProxy 类型,无法进行迭代,要怎么变成 list 呢?
2879 次点击
所在节点    Python
6 条回复
est
2019-05-07 09:06:54 +08:00
list(your_obj)
wwqgtxx
2019-05-07 09:10:55 +08:00
正常情况下 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)
wwqgtxx
2019-05-07 09:18:31 +08:00
又翻了一下 multiprocessing.Manager 的源代码,确定了一下如果你获取到的是 AutoProxy 类型,那么根据它的实现,是不会代理任何_开头的方法的,自然也不会代理__iter__,所以无法迭代,你需要保证你获取到的是一个 ListProxy 对象,也就是你不能直接共享一个 list 过去,一定要用 manager.list()打包一下再共享
wwqgtxx
2019-05-07 09:29:58 +08:00
再修正一下,对于 list 只需要代理__getitem__即可,并不需要代理__iter__
https://docs.python.org/3/library/functions.html?highlight=iter#iter
qieqie
2019-05-07 10:40:34 +08:00
naive_list = proxy[:]
反过来也可以 proxy[:] = naive_list
wakan190
2019-05-10 22:49:12 +08:00
@wwqgtxx 谢谢,后来是在客户端注册时设置了一个 baseproxy 类型,然后迭代时用_getvalue()就行了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/561648

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX