Proxy 如何在twisted中从XML-RPC回调发送XML-RPC请求

Proxy 如何在twisted中从XML-RPC回调发送XML-RPC请求,proxy,twisted,xml-rpc,Proxy,Twisted,Xml Rpc,我的应用程序需要复杂的逻辑,例如: 我的应用程序是XML-RPC服务器 当它收到XML-RPC请求时,需要进行一些计算 然后它需要调用另一个XML-RPC服务器,并解析它的响应 接下来,它需要做更多的计算和分析 将步骤4的结果返回到XML-RPC客户端 我解决了这个案子,就像这样: 从twisted.web导入xmlrpc 导入xmlrpclib 类RPCProxy(xmlrpc.xmlrpc): def xmlrpc_do_something(self、param1、param2): resu

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

  • 我的应用程序是XML-RPC服务器
  • 当它收到XML-RPC请求时,需要进行一些计算
  • 然后它需要调用另一个XML-RPC服务器,并解析它的响应
  • 接下来,它需要做更多的计算和分析
  • 将步骤4的结果返回到XML-RPC客户端
  • 我解决了这个案子,就像这样:

    从twisted.web导入xmlrpc
    导入xmlrpclib
    类RPCProxy(xmlrpc.xmlrpc):
    def xmlrpc_do_something(self、param1、param2):
    result1=self.do_some_calc1(参数1,参数2)
    s=xmlrpclib.ServerProxy('http://some.another.server:1234/RPC2')
    result2=getattr(s,“做点别的事”)(result1)
    结果3=自我。进行一些计算2(结果2)
    返回结果3
    

    如何以类似Twisted的方式实现这一点?

    Twisted中的XML-RPC服务器支持使用延迟来支持异步结果。从您的
    xmlrpc\uuwk
    方法返回延迟,在延迟触发之前不会发送响应

    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_calc1
    do_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