#python #twisted #autobahn
#python #twisted #autobahn
Вопрос:
У меня есть клиентская функция 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
Я пытался:
a) декоратор inlinecallback. Но он все равно возвращает отложенный объект.
@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? Предназначен ли этот декоратор для этой цели?
б) Я попробовал связать крючком @wait_for decorator. Это должно заставить обратный вызов исчезнуть у вызывающего абонента.
@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 с сервером прерывается с ошибкой is:
Lost client connection: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]
Как выполнить вызов Autobahn RPC и синхронно получить результат?
Комментарии:
1. Вместо этого ваш
wait_for
код используетinlineCallbacks
…2. Мне нужно внести коррективы в мой первоначальный вопрос. б) Я попробовал связать крючком @wait_for decorator. Это должно заставить обратный вызов исчезнуть у вызывающего абонента. @wait_for(тайм-аут= 5) def call_server_synchronous_get_voltage_crochet(self): val = выход self.self.call (» server.com/server#get_voltage » ) val.addCallback(результат lambda: результат) возвращает значение
3. Нажмите кнопку «Редактировать» в нижней части вопроса.
Ответ №1:
Чтобы использовать Crochet, вы, вероятно, не должны ничего давать.
@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
Комментарии:
1. Спасибо за ваш ответ. В моем исходном сообщении была ошибка. не следует использовать yield. Мой опубликованный результат — это результат без использования yield. Извините за это. Итак, это работает в первый раз. Но, когда он вызывается 2-й раз, соединение с rpc прерывается, и вызов никогда не выполняется для 2-го вызова и вызовов после этого. Не уверен, что 1) я неправильно использовал Crocket; 2) в моей программе есть другие проблемы. Основываясь на вашем сообщении, я правильно использую Crochet. Есть ли другой способ сделать это без вязания крючком?
2. Обновление: wait_for decorator работает надежно. Проблема с отключением соединения rpc оказалась другой проблемой, с которой мне приходится иметь дело.
3. Я не могу помочь с этим, если вы не предоставите дополнительную информацию.