类型错误:自动代理对象不是可迭代 - 多处理
问题描述:
考虑下面的服务器代码:类型错误:自动代理对象不是可迭代 - 多处理
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__')
应我做了什么s ^同类?有谁能给我一个例子,并向我解释这是如何工作的?
更新
澄清:假设我添加的类别:
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
天哪!我不确定这是正确的答案还是只是一个解决方法...
答
事实上,为了能够迭代你的类需要定义BaseProxy
定义的__iter__
方法,所以我猜继承是正确的方法!