2010-02-14 5 views
0

Я использую PyRo в моей программе python. И у меня проблема. класс 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

Я исправил несколько строк, которые, как я предполагал, были опечатками в вашем коде. –

+2

Я только что проверил код выше, используя последнюю версию Pyro, и он работает точно так, как я ожидал, - он печатает 10 дважды. Если я понимаю ваш пост, это то, что вы хотите. –

+0

Привет. Я совершенно не уверен, что вы пытались сделать здесь, но если я понимаю вас правильно - вы устанавливаете itemA в прокси-объект, а itemB остается нетронутым, т. Е. Это обычный экземпляр класса B? Если это так, то, что происходит в вашем коде, заключается в том, что в основном вы делаете копию ссылки на объект itemB, отправляете его на сервер, изменяете его на сервере и затем распечатываете состояние другого объекта, который изначально был созданный на стороне клиента, и который не изменяется. – Timur

ответ

1

Я считаю (и поправьте меня, если я ошибаюсь) Pyro использует асинхронные вызовы, по крайней мере, по умолчанию.

Так что, когда вы звоните callFromProxy, printvalue может получить выполняться до callfun на itemB, потому что требуется время, чтобы позвонить A.callfun и B.callfun. Если/когда это произойдет, elements["name"] будет по-прежнему 0, когда printvalue вызывается в первый раз.

+0

, если я добавлю time.sleep (5) до printvalue() в B.callFromProxy(), результат не изменится. Но запрос был удовлетворен ... – gimlis

+0

hmm. бьет меня тогда, я никогда не использовал PyRo, мой ответ был всего лишь образованной догадкой. –

 Смежные вопросы

  • Нет связанных вопросов^_^