如何同步获取autobahn 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
我尝试过:
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吗?这个装饰器是用来实现这个目的的吗?
b) 我尝试了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
这个函数确实返回了正确的值。但它只能工作一次。我是在Django服务器中调用call_server_synchronous_get_voltage_crochet()
来显示一个网页。当我第二次刷新网页时,Autobahn RPC与服务器的连接断开,并出现以下错误:
失去客户端连接:[失败实例:回溯(没有帧的失败):<class 'twisted.internet.error.ConnectionDone'>:连接已正常关闭。
如何才能同步调用Autobahn RPC并获取结果呢?
1 个回答
0
要使用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