基本上我们可以通过以下方式调用 xmlrpc 处理程序:
import xmlrpclib
s = xmlrpclib.ServerProxy('http://remote_host/rpc/')
print s.system.listmethods()
在tornado中我们可以像这样集成它:
import xmlrpclib
import tornado.web
s = xmlrpclib.ServerProxy('http://remote_host/rpc/')
class MyHandler(tornado.web.RequestHandler):
def get(self):
result = s.system.listmethods()
作为一个新手,我有以下问题:
result = s.system.listmethods()
会阻止 Tornado 吗?- 是否有非阻塞 xmlrpc 客户端?
- 我们如何实现
result=yield gen.Task(s.system.listmethods)
?
最佳答案
1.是的,它会阻止 Tornado ,因为 xmlrpclib 使用阻塞 python 套接字(按原样)
2.据我所知,但我将提供一个解决方案,您可以保留 xmlrpclib 但使其异步
3.我的解决方案不使用tornado gen。
好吧,每当您进行网络工作并需要编写异步代码时,要记住的一个有用的库是 gevent,它是一个非常好的高质量库,我会向所有人推荐。
为什么它好用且易于使用?
- 您可以以同步方式编写异步代码(这样就很容易)
您所要做的就是用一行简单的代码来进行猴子补丁:
从 gevent 导入猴子;猴子.patch_all()
使用 Tornado 时,您需要知道两件事(您可能已经知道):
- Tornado 仅在充当 HTTPServer 时支持异步 View (异步 View 不支持 WSGI)
- 异步 View 需要使用 self.finish() 或 self.render() (调用 self.finish())自行终止响应
好的,这里有一个示例,说明了必要的 gevent 与 Tornado 集成所需的内容:
# Python immports
import functools
# Tornado imports
import tornado.ioloop
import tornado.web
import tornado.httpserver
# XMLRpc imports
import xmlrpclib
# Asynchronous gevent decorator
def gasync(func):
@tornado.web.asynchronous
@functools.wraps(func)
def f(self, *args, **kwargs):
return gevent.spawn(func, self, *args, **kwargs)
return f
# Our XML RPC service
xml_service = xmlrpclib.ServerProxy('http://remote_host/rpc/')
class MyHandler(tornado.web.RequestHandler):
@gasync
def get(self):
# This doesn't block tornado thanks to gevent
# Which patches all of xmlrpclib's socket calls
# So they no longer are blocking
result = xml_service.system.listmethods()
# Do something here
# Write response to client
self.write('hello')
self.finish()
# Our URL Mappings
handlers = [
(r"/", MyHandler),
]
def main():
# Setup app and HTTP server
application = tornado.web.Application(handlers)
http_server = tornado.httpserver.HTTPServer(application)
http_server.listen(8000)
# Start ioloop
tornado.ioloop.IOLoop.instance().start()
if __name__ == "__main__":
main()
所以尝试一下这个示例(显然要根据您的需求进行调整),您应该可以开始了。
无需编写任何额外的代码,gevent 会完成修补 python 套接字的所有工作,以便可以异步使用它们,同时仍然以同步方式编写代码(这是一个真正的好处)。
希望这有帮助:)
关于Python。 Tornado 。非阻塞 xmlrpc 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13191858/