1,簡介
Tornado全稱Tornado Web Server,是一個用Python語言寫成的Web服務器兼Web應用框架,由FriendFeed公司在自己的網站FriendFeed中使用,被Facebook收購以后框架在2009年9月以開源軟件形式開放給大眾。
特點:
作為Web框架,是一個輕量級的Web框架,其擁有異步非阻塞IO的處理方式。
作為Web服務器,Tornado有較為出色的抗負載能力,官方用nginx反向代理的方式部署Tornado和其它Python web應用框架進行對比,結果最大瀏覽量超過第二名近40%。
性能:
Tornado有著優(yōu)異的性能。它試圖解決C10k問題,即處理大于或等于一萬的并發(fā)。
Tornado框架和服務器一起組成一個WSGI的全棧替代品。單獨在WSGI容器中使用tornado網絡框架或者tornaod http服務器,有一定的局限性,為了最大化的利用tornado的性能,推薦同時使用tornaod的網絡框架和HTTP服務器。
2,應用場景
1,用戶量大,高并發(fā)
如秒殺搶購、雙十一某寶購物、春節(jié)搶火車票
2,大量的HTTP持久連接
使用同一個TCP連接來發(fā)送和接收多個HTTP請求/應答,而不是為每一個新的請求/應答打開新的連接的方法。
對于HTTP 1.0,可以在請求的包頭(Header)中添加Connection: Keep-Alive。
對于HTTP 1.1,所有的連接默認都是持久連接。
3, Tornado與Django
Django
Django是走大而全的方向,注重的是高效開發(fā),它最出名的是其全自動化的管理后臺:只需要使用起ORM,做簡單的對象定義,它就能自動生成數(shù)據(jù)庫結構、以及全功能的管理后臺。
Django提供的方便,也意味著Django內置的ORM跟框架內的其他模塊耦合程度高,應用程序必須使用Django內置的ORM,否則就不能享受到框架內提供的種種基于其ORM的便利。
session功能
后臺管理
ORM
Tornado
Tornado走的是少而精的方向,注重的是性能優(yōu)越,它最出名的是異步非阻塞的設計方式。
HTTP服務器
異步編程
WebSockets
4,簡單的Tornado案例
import tornado.web
import tornado.ioloop
class IndexHandler(tornado.web.RequestHandler):
"""主路由處理類"""
def get(self):
"""對應http的get請求方式"""
self.write("Hello Python!")
if __name__ == "__main__":
app = tornado.web.Application([
(r"/", IndexHandler),
])
app.listen(8000)
tornado.ioloop.IOLoop.current().start()
以上代碼解釋說明:
tornado的基礎web框架模塊
RequestHandler
封裝了對應一個請求的所有信息和方法,write(響應信息)就是寫響應信息的一個方法;對應每一種http請求方式(get、post等),把對應的處理邏輯寫進同名的成員方法中(如對應get請求方式,就將對應的處理邏輯寫在get()方法中),當沒有對應請求方式的成員方法時,會返回“405: Method Not Allowed”錯誤。
Application
Tornado Web框架的核心應用類,是與服務器對接的接口,里面保存了路由信息表,其初始化接收的第一個參數(shù)就是一個路由信息映射元組的列表;其listen(端口)方法用來創(chuàng)建一個http服務器實例,并綁定到給定端口(注意:此時服務器并未開啟監(jiān)聽)
5,Tornado核心IOLoop循環(huán)模塊
tornado的核心io循環(huán)模塊,封裝了Linux的epoll和BSD的kqueue,tornado高性能的基石。 以Linux的epoll為例,其原理如下圖:
這里寫圖片描述
再詳細一點的圖解釋:
這里寫圖片描述
IOLoop.current() 返回當前線程的IOLoop實例。
IOLoop.start() 啟動IOLoop實例的I/O循環(huán),同時服務器監(jiān)聽被打開。
6,Tornado Web程序編寫思路
1,創(chuàng)建web應用實例對象,第一個初始化參數(shù)為路由映射列表。
2,定義實現(xiàn)路由映射列表中的handler類。
3,創(chuàng)建服務器實例,綁定服務器端口。
4,啟動當前線程的IOLoop。