如何从扭曲的XML-RPC回调发送XML-RPC请求

Sha*_*man 3 proxy xml-rpc twisted

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

  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
Run Code Online (Sandbox Code Playgroud)

我应该如何以扭曲的方式做到这一点?

Jea*_*one 5

Twisted中的XML-RPC服务器支持使用Deferreds来支持异步结果.从您的xmlrpc_方法返回延期,并且在延迟激活之前不会发送任何响应.

Twisted还有一个支持Deferreds的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
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)