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