首先基本的同步流程是:
class Index(tornado.web.RequestHandle): def get(self): self.write('hellow,word') app = tornado.web.Application( [(r'/index',Index) ] ) if __name == '__main__': app.listen(8000) tornado.ioloop.IOLoop.instance().start()
基本的异步流程是:
import tornado.web import tornado.ioloop from tornado import gen from tornado.web import Future import time class MainHandler(tornado.web.RequestHandler): @gen.coroutine def get(self): print 123 future = Future() tornado.ioloop.IOLoop.current().add_timeout(time.time() +5 ,self.doing) yield future def doing(self): self.write('1111') self.finish() app = tornado.web.Application( [(r'/index',MainHandler)] ) if __name__ == '__main__': app.listen(8000) tornado.ioloop.IOLoop.instance().start()
主要三个步骤实现异步,
1、future函数
2、事件循环
3、生成器
源码实现:
route = ( /^index$ func ) result_dict{ } s = socket.socket(...) s.bind(...) s.setblock(False) inputs = [] inputs.append(s) while True: r,w,e = select.select(inputs,[],e,0.05) 如果有链接连入,那么这个时候变化的是服务器的socket对象,所以连接的时候返回的r就是s,如果不是s那就是已连接的其他socket对象发送数据了 for i in r: if r == s: conn,addr = i.accept() inputs.append(conn) else: #有数据来了 data_list = [] while True: data = i.recv(1024) data.append(data) if not data: breake #这个时候需要响应,在datalist里面获取请求头,获取url,然后获取url对应的函数 data = func() if data is str: i.sendall() i.close() inputs.remove(i) else: #如果返回的不是一个字符串而是一个对象,那么这个时候把这个对象保存到字典里面 result_dict[i] = data for k,v in result_dict.items(): if v.status: k.sendall()