tornado源码简单实现

首先基本的同步流程是:

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()

  

原文地址:https://www.cnblogs.com/qiangayz/p/9393707.html