TypeError:AutoProxy 对象不可迭代 - 多处理
Posted
技术标签:
【中文标题】TypeError:AutoProxy 对象不可迭代 - 多处理【英文标题】:TypeError: AutoProxy object is not iterable - multiprocessing 【发布时间】:2011-08-27 03:16:51 【问题描述】:考虑以下服务器代码:
from multiprocessing.managers import BaseManager, BaseProxy
def baz(aa) :
print "aaa"
l = []
for i in range(3) :
l.append(aa)
return l
class SolverManager(BaseManager): pass
manager = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
manager.register('solver', baz)
server = manager.get_server()
server.serve_forever()
和相关的客户:
import sys
from multiprocessing.managers import BaseManager, BaseProxy
class SolverManager(BaseManager): pass
def main(args) :
SolverManager.register('solver')
m = SolverManager(address=('127.0.0.1', 50000), authkey='mpm')
m.connect()
for i in m.solver(args[1]):
print i
if __name__ == '__main__':
sys.exit(main(sys.argv))
我想我在这里遗漏了一些重要的东西。我的猜测是我必须继承 BaseProxy 类来提供一个可迭代的对象,但到目前为止我还没有成功。
当我运行客户端时出现此错误:
Traceback (most recent call last):
File "mpmproxy.py", line 17, in <module>
sys.exit(main(sys.argv))
File "mpmproxy.py", line 13, in main
for i in m.solver(args[1]):
TypeError: 'AutoProxy[solver]' object is not iterable
但是,如果我尝试打印它,列表就在那里......也许它也与客户端和服务器之间的数据序列化方式有关......
在文档中有一个类似的案例(使用生成器),他们使用以下类来访问数据:
class GeneratorProxy(BaseProxy):
_exposed_ = ('next', '__next__')
def __iter__(self):
return self
def next(self):
return self._callmethod('next')
def __next__(self):
return self._callmethod('__next__')
我应该做类似的事情吗?谁能给我一个例子并向我解释这是如何工作的?
更新
澄清一下:假设我添加了类:
class IteratorProxy(BaseProxy):
def __iter__(self):
print self
return self
在客户端我将函数注册为
SolverManager.register('solver', proxytype=IteratorProxy)
我得到的错误是:
$python mpmproxy.py test
['test', 'test', 'test']
Traceback (most recent call last):
File "mpmproxy.py", line 22, in <module>
sys.exit(main(sys.argv))
File "mpmproxy.py", line 18, in main
for i in m.solver(args[1]):
TypeError: iter() returned non-iterator of type 'IteratorProxy'
我觉得我在这里错过了一些愚蠢的东西......
更新 2
我想我解决了这个问题:
关键是要获得真正的价值:
for i in m.solver(args[1])._getvalue():
print i
天哪!!!我不确定这是正确的答案还是只是一种解决方法......
【问题讨论】:
感谢您的解决!我不知道你是怎么想出来的。你刚刚为我节省了一大堆时间,谢谢!返回 BS 代理对象的这种非常奇怪的行为似乎是特定于列表的。 dicts 很好,甚至包含列表的 dicts 也很好。 其实这个问题中的更新2就解决了我的问题,和这个很相似。不需要使用任何代理(例如 BaseProxy、GeneratorProxy、IteratorProxy)。我刚刚添加了._getvalue()
来检索客户端中的对象。
【参考方案1】:
确实,要实现可迭代,您的类需要定义BaseProxy
定义的__iter__
方法,所以我想继承是正确的方法!
【讨论】:
以上是关于TypeError:AutoProxy 对象不可迭代 - 多处理的主要内容,如果未能解决你的问题,请参考以下文章
pyspark:TypeError:'float'对象不可迭代
django:TypeError:'tuple'对象不可调用