2011-05-17 3 views
3

considèrent le code du serveur suivant:TypeError: objet AutoProxy n'est pas itérable - multitraitement

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() 

et le client associé:

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)) 

Je pense que je manque quelque chose d'important ici. Ma conjecture est que je dois sous-classer la classe BaseProxy pour fournir un objet itératif, mais jusqu'ici je n'ai pas réussi à le faire correctement.

quand je lance le client je reçois cette erreur:

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 

si je tente de l'imprimer, la liste est là ... Peut-être qu'il a aussi quelque chose à voir avec la façon dont les données sont sérialisées entre client et serveur ...

dans la documentation il y a un cas similaire (avec un générateur) et ils utilisent la classe suivante pour accéder aux données:

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__') 

est quelque chose que je ne s imilar? Quelqu'un peut-il me donner un exemple et m'expliquer comment cela fonctionne?

mise à jour

Pour clarifier: supposons que j'ajoute la classe:

class IteratorProxy(BaseProxy): 
    def __iter__(self): 
     print self 
     return self 

et dans le client j'enregistrer la fonction

SolverManager.register('solver', proxytype=IteratorProxy) 

l'erreur que je reçois est:

$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' 

J'ai l'impression que je manque quelque chose de stupide ici ...

mise à jour 2

Je pense que je l'ai résolu ce problème:

Le point était d'obtenir la valeur réelle:

for i in m.solver(args[1])._getvalue(): 
    print i 

gosh !!! Je ne suis pas sûr si c'est la bonne réponse ou juste une solution de contournement ...

Répondre

0

En effet, pour être itérable, votre classe doit définir la méthode __iter__ que BaseProxy définit, donc je suppose que l'héritage est la bonne voie à suivre!

Questions connexes