Tornado 异步非阻塞
from tornado import gen
class MainHandler(tornado.web.RequestHandler):
@gen.coroutine #关键点
def get(self):
futrue =Future()#关键点
#阻塞内容,必须写这个格式,time.sleep不好使
#tornado.ioloop.IOLoop.current().add_timeout(time.time()+10,self.doing) #关键点 self.doing 回调函数
http = httpclient.AsyncHTTPClient()
#yield futrue#关键点
yield http.fetch("http://www.google.com",self.doing)
def doing(self,*args,**kwargs):#关键点
self.write('返回内容'
self.finish())
回调函数执行时间:
超时时间之后执行
或
http请求消息返回之后执行。
如果future没有做事的时候,这个回调函数永远不执行
因为做事之后会默认执行future.set_result()方法,这个方法执行回调函数
本质上就看这个set_result什么时候执行。
tornado会将这个io操作放到tornado内部的io多路复用中。
检测是否执行完毕,没有则一直执行,框架去执行其他请求。
如果执行完就执行set_result
如果用tronado的异步非阻塞,必须是io请求,不然没有意义。