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

У меня есть клиентская функция 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 и синхронно получить результат?


person user3792705    schedule 01.07.2014    source источник
comment
В вашем коде wait_for вместо этого используется inlineCallbacks...   -  person Jean-Paul Calderone    schedule 01.07.2014
comment
Мне нужно внести поправку в мой первоначальный вопрос. б) Я попробовал декоратор Crochet @wait_for. Это должно заставить обратный вызов исчезнуть из вызывающего абонента. @wait_for(timeout=5) def call_server_synchronous_get_voltage_crochet(self): val = yield self.self.call(server.com/ server#get_voltage) val.addCallback(лямбда-результат: результат) return val   -  person user3792705    schedule 01.07.2014
comment
Нажмите кнопку редактирования внизу вопроса.   -  person Jean-Paul Calderone    schedule 01.07.2014


Ответы (1)


Чтобы использовать вязание крючком, вы, вероятно, ничего не должны уступать.

@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
person Jean-Paul Calderone    schedule 01.07.2014
comment
Спасибо за ответ. В моем исходном сообщении была ошибка. доход не следует использовать. Мой опубликованный результат - это результат без использования yield. Сожалею об этом. Таким образом, это работает в 1-й раз. Но когда он вызывается во второй раз, соединение rpc разрывается, и вызов никогда не происходит для второго вызова и вызовов после этого. Не уверен, что 1) я неправильно использовал Crocket; 2) у моей программы есть другие проблемы. Основываясь на вашем сообщении, я правильно использую вязание крючком. Есть ли другой способ сделать это без вязания крючком? - person user3792705; 02.07.2014
comment
Обновление: декоратор wait_for работает надежно. Проблема разрыва соединения rpc оказалась другой проблемой, с которой мне приходилось иметь дело. - person user3792705; 02.07.2014
comment
Я не могу помочь с этим, если вы не предоставите больше информации. - person Jean-Paul Calderone; 02.07.2014