2011-05-17 89 views
3

考虑下面的服务器代码:类型错误:自动代理对象不是可迭代 - 多处理

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 

天哪!我不确定这是正确的答案还是只是一个解决方法...

回答

0

事实上,为了能够迭代你的类需要定义BaseProxy定义的__iter__方法,所以我猜继承是正确的方法!

相关问题