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
从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