【发布时间】:2014-07-01 07:14:02
【问题描述】:
我的 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) 内联回调装饰器。但是,它仍然返回延迟对象。
@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) 我尝试了钩针 @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 与服务器的连接被丢弃,错误:
Lost client connection: [Failure instance: Traceback (failure with no frames): <class 'twisted.internet.error.ConnectionDone'>: Connection was closed cleanly.
]
如何调用 Autobahn RPC 并同步返回结果?
【问题讨论】:
-
您的
wait_for代码使用inlineCallbacks代替... -
我需要更正我原来的问题。 b)我尝试了钩针 @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(lambda result: result) return val
-
点击问题底部的“编辑”按钮。