У меня есть клиентская функция Autobahn PRC, определенная следующим образом:
def call_server_get_voltage(self):
self.call("http://server.com/server#get_voltage").addCallback(self.on_get_voltage)
def on_get_voltage(self, result_voltage):
print "on_get_voltage: " + result_voltage
Приведенный выше код вызывает функцию сервера RPC «get_voltage». Он работает нормально, и напряжение правильно считывается с RPC-сервера.
Но я хочу сделать синхронный вызов. Это должно выглядеть следующим образом, не получая значение в функции обратного вызова.
def call_server_synchronous_get_voltage(self):
(How to combine above callback function, so that it will be synchronous)
return voltage
Я старался:
а) встроенный декоратор обратного вызова. Но он по-прежнему возвращает отложенный объект.
@inlineCallbacks
def call_server_synchronous_get_voltage_inlinecallback(self):
#'val' is correct value from server
val = yield self.self.call("http://server.com/server#get_voltage")
#but how to return it????
returnValue(val) #This is deferred object. Not voltage value
Может ли кто-нибудь помочь мне понять @inlineCallback? Этот декоратор для этой цели?
б) Я попробовал декоратор Crochet @wait_for. Это должно заставить обратный вызов исчезнуть из вызывающего абонента.
@wait_for(timeout=10)
def call_server_synchronous_get_voltage_crochet(self):
val = self.self.call("http://server.com/server#get_voltage")
val.addCallback(lambda result: result)
return val
Эта функция возвращает правильное значение. Но это работает только один раз. Я вызываю call_server_synchronous_get_voltage_crochet()
с сервера Django для отображения веб-страницы. При перезагрузке веб-страницы во второй раз соединение Autobahn RPC с сервером разрывается с ошибкой:
Lost client connection: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]
Как сделать вызов Autobahn RPC и синхронно получить результат?
wait_for
вместо этого используетсяinlineCallbacks
... - person Jean-Paul Calderone   schedule 01.07.2014