初识tornado
全称 Tornado Web Server , 是一个用Python编写的开源异步HTTP服务器,同时也是一个web开发框架
-
特点
- 作为web框架,是一个轻量级的web框架,其拥有异步非阻塞IO的处理方式
- 作为web服务器,Tornado有较为出色的抗负载能力,官方用tornado和其他python web框架做对比,结果最大浏览量超过第二名近40%
-
使用场景
-
用户量大,高并发
-
大量得 HTTP 持久连接
(1) 使用同一个tcp连接来发送和接收多个 HTTP 请求/应答,而不是为每一个新的请求/应答 打开新的连接 得方法
(2) 对于HTTP 1.0 , 可以在请求头(Header)中添加Connection: Keep-Alive=
(3) 对于HTTP 1.1 , 所有的连接默认都是持久连接
-
-
C10K问题
随着互联网的普及,应用的用户群体几何倍增长,此时服务器性能问题就出现。最初的服务器是基于进程/线程模型。新到来一个TCP连接,就需要分配一个进程。假如有C10K,就需要创建1W个进程,通常用C10K这一概念来描述。即并发10000个连接。
对于单台服务器来说,根本无法承担。多台服务器分布式又要付出高昂的成本
tornado 解决C10k问题
tornado在设计之初就考虑到了性能因素,它的 web server 从底层开始就自己实现了一整套基于 epoll 的单线程异步架构,旨在解决C10K问题
tornado 基础
-
第一个Tornado代码
import tornado.web #Tornado的基础web框架模块 import tornado.ioloop #Tornado的核心io模块,封装了linux的epoll和BSD的kqueue,是tornado高效的基础 # 处理类(相当于Django中的类视图) class IndexHandler(tornado.web.RequestHandler): # 路由处理方法(匹配路由后执行) def get(self, *args, **kwargs): # 一个响应,响应信息 self.write("sunck is a good man") if __name__ == '__main__': # 创建一个app实例(一个应用) # Application:Tornado web的核心类,是与服务器接口对应,里面保存了路由映射表,添加设置,用listen方法创建一个httpf服务器示例,并绑定端口(注意:此时服务器并没有开启监听) app = tornado.web.Application([ (r'/', IndexHandler), ]) #绑定监听的端口,注意:此时也没有开启监听 app.listen(8000) #IOLoop.current() :返回当前线程的IOLoop实例 #IOLoop.start() :开启IOLoop实例的I/O循环,同时服务器开启监听 tornado.ioloop.IOLoop.current().start()
-
Tornado 运行流程
-
httpserver
HTTPServer在httpserver.py中实现,继承自TCPServer,是一个无阻塞、单线程HTTP服务器,支持多进程为prefork模式实现