Как синхронно получить отложенное значение объекта из вызова autobahn RPC

#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. Я не могу помочь с этим, если вы не предоставите дополнительную информацию.