2011-05-17 123 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__方法,所以我猜繼承是正確的方法!

相關問題