4. 协程异步/多线程处理
以协程方式(Coroutine)进行异步处理,是Tornado推荐的方式。Coroutine不采用回调函数方式,而用yield来挂起和恢复运行(现在又有新关键字了,说明python的Coroutine还没有稳定下来),协程编程风格看起来像同步,但又没有线程的切换,因此效率要高一些。
在Tornado中,现在有两种方式实现协程:一是函数前加@tornado.gen.coroutine修饰器,异步函数前加yield,这是一种较“老”的方式;二是函数采用async定义,异步函数前加await。async和await是python3.5引入的,目前是python内置方式,因此后者的运行效率比前者要高些。但Tornado官网上也说了后者的不足:对老版本的兼容不如前者;yield适用性上也比await广些,例如面对future list时。
下面是以异步方式运行业务逻辑的三个页面示例。
import time
import tornado.ioloop
import tornado.web
import tornado.httpclient
import tornado.gen
class time_consuming_handler(tornado.web.RequestHandler):
async def get(self):
t1 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
result = await tornado.ioloop.IOLoop.current().run_in_executor(None, self.do_task,5)
self.wri