TypeError:AutoProxy对象不可迭代 - 多处理

时间:2011-05-17 10:30:56

标签: python proxy multiprocessing autoproxy

考虑以下服务器代码:

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
天啊!我不确定这是正确答案还是只是解决方法......

1 个答案:

答案 0 :(得分:0)

实际上,为了可迭代,您的类需要定义__iter__定义的BaseProxy方法,所以我认为继承是正确的方法!