proxy - 如何从 Twisted 中的 XML-RPC 回调发送 XML-RPC 请求

标签 proxy twisted xml-rpc

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

  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 的方式做到这一点?

最佳答案

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

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

如果 do_some_calc1do_some_calc2 是线程安全的 CPU 绑定(bind)操作,那么您可以轻松地将它们放入线程池中,并为其结果获取 Deferred :

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

关于proxy - 如何从 Twisted 中的 XML-RPC 回调发送 XML-RPC 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8973268/

相关文章:

events - 如何对事件循环进行单元测试?

python - 扭曲的审判 : How to test a MultiService with a client in it -- Reactor was unclean

python - 以编程方式为 python 中的 SOAP 端点调用 RPC 方法

php - 使用 xml-rpc 向自定义字段添加值

spring - @scope 注释的proxyMode 和上下文组件扫描的scoped Proxy 之间的区别。?

cocoa - 使用 NSProxy 和forwardInitation :

shell - nginx:使用环境变量

python - 如何在python中控制子线程进程?

python - 如何在此服务器中实现 Websocket 握手?

java - Drupal-6/PHP 到 Java 数据检索