如何同步获取autobahn RPC调用的延迟对象值

2 投票
1 回答
963 浏览
提问于 2025-04-18 11:41

我有一个定义好的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

撰写回答