tornado ------ RequestHandler------异步化和协程化

  之前RequestHandler类的子类虽然重写了各种方法,但是当处理逻辑比较复杂和等待外部IO时,就会服务阻塞,下面是两

种提高并发的方法。

  异步化:针对RequestHandler 的处理函数使用@tornado.web.asynchronous 修饰器,将默认的同步机制改成异步机制。

  协程化:针对RequestHandler 的处理函数使用@tornado.gen.coroutine 修饰器,将默认的同步机制改为协程机制。

异步化

 1 import tornado.web
 2 import tornado.httpclient
 3 
 4 
 5 class MainHandler(tornado.web.RequestHandler):
 6     @tornado.web.asynchronous
 7     def get(self, *args, **kwargs):
 8         http = tornado.httpclient.AsyncHTTPClient()
 9         http.fetch("http://www.baidu.com/", callback=self.on_finish)
10 
11     def on_response(self, response):
12         if response.error:
13             raise tornado.web.HTTPError(500)
14         self.write(response.body)
15         self.finish()

协程化

 1 import tornado.web
 2 import tornado.gen
 3 import tornado.httpclient
 4 
 5 
 6 class MainHandler(tornado.web.RequestHandler):
 7     @tornado.gen.coroutine
 8     def get(self):
 9         http = tornado.httpclient.AsyncHTTPClient()
10         response = yield http.fetch("http://www.baidu.com/")
11         self.write(response.body)

  关键技术:

    用tornado.gen.coroutine装饰MainHandler 的 get()、post()等处理函数。

    使用异步对象处理耗时操作,比如本例的 AsyncHTTPClient 。

    调用yield关键字获取异步对象的处理结果。

posted @ 2018-06-11 21:22  巴蜀秀才  阅读(425)  评论(0编辑  收藏  举报