【问题标题】:How to get deferred object value from autobahn RPC call synchronously如何从高速公路 RPC 调用同步获取延迟对象值
【发布时间】: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
  • 点击问题底部的“编辑”按钮。

标签: python twisted autobahn


【解决方案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

【讨论】:

  • 感谢您的回复。我原来的帖子有错误。不应使用产量。我发布的结果是不使用产量的结果。对不起。所以,它确实第一次工作。但是,当它被第二次调用时,rpc 连接被丢弃,并且第二次调用和之后的调用都不会发生调用。不确定是否 1) 我错误地使用了 Crocket; 2)我的程序有其他问题。根据您的帖子,我正确使用钩针。没有钩针还有其他方法吗?
  • 更新:wait_for 装饰器确实可以可靠地工作。 rpc 连接断开的问题被证明是我必须处理的另一个问题。
  • 除非您提供更多信息,否则我无能为力。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2014-05-15
  • 2021-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多