2010-02-14 54 views
0

我在我的python程序中使用PyRo。我有一個問題。 B類:在callFromProxy中打印0,但在callfun中打印右值= 10。爲什麼?怎麼修?PyRo和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

我修復了一些我認爲是代碼中的拼寫錯誤的行。 – 2010-02-14 14:30:51

+2

我剛剛使用最新的Pyro版本測試了上述代碼,它的工作原理與我預期的完全相同 - 它打印10次兩次。如果我理解你的帖子,這就是你想要的。 – 2010-02-14 16:02:48

+0

嗨。我完全不確定你在這裏做什麼,但是如果我理解你是正確的 - 你將itemA設置爲代理對象,並且itemB保持原樣,即它是B類的正常實例嗎? 如果是這樣,那麼在你的代碼中會發生什麼,基本上是你製作一個對象itemB的引用副本,將​​它發送到服務器,在服務器上修改它,然後打印出另一個對象的狀態在客戶端創建,並沒有改變。 – Timur 2011-07-21 19:17:37

回答

1

我相信(並糾正我,如果我錯了)PyRo使用異步調用,至少在默認情況下。

所以,當你調用callFromProxyprintvalue可能會callfunitemB之前,因爲它需要時間來打電話A.callfunB.callfun執行。如果/發生這種情況,當printvalue首次被調用時,elements["name"]仍將爲0。

+0

如果我在B.callFromProxy()的printvalue()之前添加time.sleep(5),結果將不會改變。但要求是complited ... – gimlis 2010-02-14 15:00:24

+0

嗯。然後我打敗了我,我從來沒有使用PyRo,我的回答只是一個受過教育的猜測。 – 2010-02-14 15:14:10