Twisted中的XML-RPC服务器支持使用Deferred来支持异步结果。从
我的应用程序中需要复杂的逻辑,例如:
- 我的应用程序是XML-RPC服务器
- 当它收到XML-RPC请求时,它需要进行一些计算
- 然后,它需要调用另一个XML-RPC服务器,并解析它的响应
- 接下来,它需要做更多的计算
- 将步骤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
我应该如何以扭曲的方式来做这件事?
xmlrpc_
方法返回一个Deferred,在Deferred激发之前不会发送任何响应。
Twisted还有一个支持Deferred的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绑定操作,那么您可以很容易地将它们推入线程池,并为它们的结果获得一个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