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关键字获取异步对象的处理结果。
清澈的爱,只为中国