2010-02-14 12 views
0

J'utilise PyRo dans mon programme python. Et j'ai un problème. classe B: Dans callFromProxy, imprime 0, mais callfun imprime la valeur correcte = 10. Pourquoi? Comment réparer?PyRo et python

class A(Pyro.core.ObjBase): 
# set link to item class B 
def set(self, real_B): 
    self.item_B = real_B 

# call function callfun in item_B 
def callfun(self): 
    self.item_B.callfun(10) 

class B(Pyro.core.ObjBase): 
# init class B 
def __init__(self): 
    self.elements = {"name":0} 

# set proxy to item class A 
def set(self, proxyA): 
    self.proxyA = proxyA 

# print 
def printvalue(self): 
    print self.elements["name"] 

# call from proxy 
def callFromProxy(self): 
    self.proxyA.callfun() 
    self.printvalue() # this is not print 10, print 0 

# call function 
def callfun(self, value): 
    self.elements["name"] = value 
    self.printvalue() # but this is print 10 

itemA = A() 

# proxyA connect from PyRo to itemA 

itemB = B() 
itemB.set(itemA) 

itemA.set(itemB) 

itemB.callFromProxy() # this is not print 10 
+0

J'ai corrigé quelques lignes que je supposais être des fautes de frappe dans votre code. –

+2

Je viens de tester le code ci-dessus en utilisant la dernière version de Pyro et cela fonctionne exactement comme je l'avais prévu - il imprime 10 fois deux fois. Si je comprends votre message, ce que vous voulez. –

+0

Salut. Je ne suis pas tout à fait sûr de ce que vous essayiez de faire ici, mais si je vous comprends bien, vous placez itemA dans un objet proxy, et itemB est laissé intact, c'est-à-dire une instance régulière de classe B? Si c'est le cas, alors ce qui se passe dans votre code, c'est que vous faites une copie d'un objet B, l'envoie au serveur, le modifie sur le serveur, puis imprime l'état d'un autre objet créé du côté client et qui n'est pas modifié. – Timur

Répondre

1

Je crois (et corrigez-moi si je me trompe) Pyro utilise des appels asynchrones, au moins par défaut.

Ainsi, lorsque vous appelez callFromProxy, printvalue obtiendrez peut-être exécuté avant callfun sur itemB, car il faut du temps pour appeler A.callfun et B.callfun. Si/quand cela se produit, elements["name"] sera toujours 0 lorsque printvalue est appelé pour la première fois.

+0

si j'ajoute time.sleep (5) avant printvalue() dans B.callFromProxy(), le résultat ne changera pas. Mais la demande a été complétée ... – gimlis

+0

hmm. me bat alors, je n'ai jamais utilisé PyRo, ma réponse était juste une supposition éclairée. –