Tornado启动流程分析
我们先来看一下所有地方都会出现的Hello World的例子:
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
从上边的例子可以看出,tornado显示定义了一个Application, 在Application定义了不同的URI的路由,例子中给出的URI的路由就是r”/“,对应处理类就是MainHandler,他们被放在同一个tuple里形成了关联。Application接受一个列表,因此可以在这边定义多个全局路由对应不同的处理方式。
之后让这个Application去监听8888端口。这边其实隐藏了不少细节,Application的listen方法其实是对HTTPServer的lisnten进行了一个封装,而HTTPServer又是调用TCPServer的listen方法监听的端口。
我们都知道一般服务器的工作流程:首先按照socket->bind->listen顺序创建listen socket监听客户端,然后当socket中有数据过来的时候,再处理这部分数据。
这个流程就跟上边的listen对上了, 只不过框架帮我们隐藏了很多细节。在监听完端口之后,就会运行一个IOLoop的单例实例,然后服务器就正式开始运行了。当然中间其实有很多其他的步骤,比如注册socket到IOLoop, IOLoop的while大循环处理数据等。之后可以再详细研究,贴一个从网上找到的一个启动的基本流程图