【问题标题】:How to send XML-RPC request from XML-RPC callback in twisted如何以扭曲的方式从 XML-RPC 回调发送 XML-RPC 请求
【发布时间】:2012-02-16 21:34:35
【问题描述】:

我的应用程序需要复杂的逻辑,例如:

  1. 我的应用是 XML-RPC 服务器
  2. 当它收到 XML-RPC 请求时,需要进行一些计算。
  3. 然后它需要调用另一个 XML-RPC 服务器,并解析它的响应。
  4. 接下来需要做更多的计算和
  5. 将第 4 步的结果返回给 XML-RPC 客户端。

我以类似的方式解决了这个案例:

from twisted.web import xmlrpc
import xmlrpclib

class RPCProxy(xmlrpc.XMLRPC):

  def xmlrpc_do_something(self, param1, param2):
    result1 = self.do_some_calc1(param1, param2)
    s = xmlrpclib.ServerProxy('http://some.another.server:1234/RPC2')
    result2 = getattr(s, 'do_something_else')(result1)
    result3 = self.do_some_calc2(result2)
    return result3

我应该如何以类似 Twisted 的方式执行此操作?

【问题讨论】:

    标签: proxy twisted xml-rpc


    【解决方案1】:

    Twisted 中的 XML-RPC 服务器支持使用 Deferreds 来支持异步结果。从您的 xmlrpc_ 方法返回一个 Deferred,在 Deferred 触发之前不会发送任何响应。

    Twisted 还有一个支持延迟的 XML-RPC 客户端库。

    from twisted.web import xmlrpc
    
    class RPCProxy(xmlrpc.XMLRPC):
    
        def xmlrpc_do_something(self, param1, param2):
            result1 = self.do_some_calc1(param1, param2)
            s = xmlrpc.Proxy('http://some.another.server:1234/RPC2')
            deferredResult = s.callRemote('do_something_else', result1)
            deferredResult.addCallback(self.do_some_calc2)
            return deferredResults
    

    如果do_some_calc1do_some_calc2 是线程安全的受CPU 限制的操作,那么您可以轻松地将它们推入线程池并为它们的结果获得延迟:

    from twisted.web import xmlrpc
    from twisted.internet import threads
    
    class RPCProxy(xmlrpc.XMLRPC):
    
        def xmlrpc_do_something(self, param1, param2):
            deferredResult = threads.deferToThread(self.do_some_calc1, param1, param2)
    
            def gotCalc1(result1):
                s = xmlrpc.Proxy('http://some.another.server:1234/RPC2')
                return s.callRemote('do_something_else', result1)
            deferredResult.addCallback(gotCalc1)
    
            def gotResult2(result2):
                return threads.deferToThread(self.do_some_calc2, result2)
            deferredResult.addCallback(gotResult2)
    
            return deferredResults
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 2011-12-25
      • 2012-07-29
      • 1970-01-01
      相关资源
      最近更新 更多