Python.龙卷风.非块XMLRPC客户端



基本上我们可以按照方式调用xmlrpc处理程序:

import xmlrpclib
s = xmlrpclib.ServerProxy('http://remote_host/rpc/')
print s.system.listmethods()

在龙卷风中,我们可以这样整合:

import xmlrpclib
import tornado.web
s = xmlrpclib.ServerProxy('http://remote_host/rpc/')
class MyHandler(tornado.web.RequestHandler):
    def get(self):
        result = s.system.listmethods()

我有关注,有点新手,问题:

  1. result = s.system.listmethods()会阻止龙卷风吗?
  2. 周围有任何非阻止XMLRPC客户端?
  3. 我们如何实现result = yield gen.Task(s.system.listmethods)

1.是的。

2.我知道的不是,但是我会提供一个解决方案,您可以保留xmlrpclib,但请使用异步

3.我的解决方案不使用龙卷风gen。

好吧,因此,每当您进行网络进行网络并需要编写异步代码时,一个有用的库是一个非常好的高质量库,我会向所有人推荐。

为什么它良好且易于使用?

  • 您可以同步编写异步代码(这使它变得容易)
  • 您所要做的,要这样做是用一条简单的线条:

    来自Gevent Import Monkey;monkey.patch_all()

使用龙卷风时,您需要知道两件事(您可能已经知道):

  • 龙卷风仅在充当httpserver时支持异步视图(WSGI不支持异步视图)
  • 异步观点需要通过使用self.finish()或self.render()(称为self.finish())
  • 来自行终止响应

好吧,这是一个示例,说明您与龙卷风的必要GEVENT集成所需的内容:

# 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插座的所有工作,以便它们可以不同步,同时仍以同步方式编写代码(这是一个真正的奖励)。

>

希望这会有所帮助:)

我不这么认为。因为龙卷风有自己的Ioloop,但Gevent的Ioloop是Libevent。因此,吉文(Gevent)将阻止龙卷风的iOloop。

最新更新