1
est 2019-05-07 09:06:54 +08:00
list(your_obj)
|
2
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) |
3
wwqgtxx 2019-05-07 09:18:31 +08:00
又翻了一下 multiprocessing.Manager 的源代码,确定了一下如果你获取到的是 AutoProxy 类型,那么根据它的实现,是不会代理任何_开头的方法的,自然也不会代理__iter__,所以无法迭代,你需要保证你获取到的是一个 ListProxy 对象,也就是你不能直接共享一个 list 过去,一定要用 manager.list()打包一下再共享
|
4
wwqgtxx 2019-05-07 09:29:58 +08:00
再修正一下,对于 list 只需要代理__getitem__即可,并不需要代理__iter__
https://docs.python.org/3/library/functions.html?highlight=iter#iter |
5
qieqie 2019-05-07 10:40:34 +08:00
naive_list = proxy[:]
反过来也可以 proxy[:] = naive_list |