Tornado介绍
文章目錄
- 特點
- 結構
- Tornado實現(xiàn)異步原理
- 模塊
- Tornado服務器的三個底層核心模塊
- 設計模型
Tornado龍卷風是一個開源的網(wǎng)絡服務器框架,它是基于社交聚合網(wǎng)站FriendFeed的實時信息服務開發(fā)而來的
- Tornado是使用Python編寫的Web服務器兼Web應用框架
- 與主流Web服務器框架不同的是,Tornado是異步非阻塞式服務器,得益于非阻塞式和對epoll模型的運用
- Tornado是實時Web服務的一個理想框架,它非常適合開發(fā)長輪詢、WebSocket和需要與每個用戶建立持久連接的應用
特點
-
輕量級Web框架
-
異步非阻塞IO處理方式
-
Tornado采用的單進程單線程異步IO的網(wǎng)絡模式,其高性能源于Tornado基于Linux的Epoll(UNIX為kqueue)的異步網(wǎng)絡IO
-
出色的抗負載能力
-
不依賴多進程或多線程
-
WSGI全棧替代產品
WSGI把應用(Application)和服務器(Server)結合起來,Tornado既可以是WSGI應用也可以是WSGI服務 -
既是WebServer也是WebFramework
Tornado是基于Bret Taylor和其他人員為FrientFeed所開發(fā)的網(wǎng)絡服務框架,當FriendFeed被Facebook收購后得以開源。不同于那些最多只能達到1w并發(fā)連接的傳統(tǒng)網(wǎng)絡服務器。Tornado在設計之初就考慮到了性能因素,旨在解決C10K問題,這樣的設計使其成為一個擁有高性能的框架
結構
- Web框架
主要包括RequestHandler用于創(chuàng)建Web應用程序和各種支持類的子類 - HTTP服務器與客戶端
主要包括HTTPServer和AsyncHTTPClient - 異步網(wǎng)絡庫
主要包括IOLoop和IOStream作為HTTP組件的構建塊 - 協(xié)程庫
Tornado的Web框架和HTTP服務器一起提供了完整的堆棧替代方案WSGI
Tornado實現(xiàn)異步原理
注1:yield 一個 Future對象,那么Tornado會等待,直到執(zhí)行future.set_result(’…’)才會釋放
注2:epoll實質是不斷的輪詢所負責的所有socket,當某個socket有數(shù)據(jù)到達了,就通知用戶進程
Tornado實現(xiàn)異步非阻塞舉例
模塊
Tornado是一個輕量級框架,它的模塊不多最重要的模塊是web,web模塊包含了Tornado大部分主要功能的Web框架,其他模塊都是工具性質的,以便讓Web模塊更加有用。
Core Web Framework 核心Web框架
- tornado.web 包括Web框架大部分主要功能,包括RequestHandler和Application類
- tornado.httpserver一個無阻塞HTTP服務器的實現(xiàn)
- tornado.template模板系統(tǒng)
- tornado.escape HTML、JSON、URLs等編碼解碼和字符串操作
- tornado.locale國際化支持
Asynchronous Networking 異步網(wǎng)絡底層模塊
- tornado.ioloop 核心IO循環(huán)
- tornado.iostream對非阻塞的Socket的簡單封裝以方便常用讀寫操作
- tornado.httpclient無阻塞的HTTP服務器實現(xiàn)
- tornado.netutil網(wǎng)絡應用的實現(xiàn)主要是TCPServer類
Integration With Other Services 系統(tǒng)集成服務
- tornado.auth 使用OpenId和OAuth進行第三方登錄
- tornado.databaseMySQL服務端封裝
- tornado.platform.twisted在Tornado上運行Twisted實現(xiàn)的代碼
- tornado.websocket實現(xiàn)和瀏覽器的雙向通信
- tornado.wsgi其他Python網(wǎng)絡框架或服務器的相互操作
Utilities 應用模塊
- tornado.autoload產生環(huán)境中自動檢查代碼更新
- tornado.gen基于生成器的接口,使用該模塊 保證代碼異步運行
- tornado.httputil分析HTTP請求內容
- tornado.options解析終端參數(shù)
- tornado.process多進程實現(xiàn)的封裝
- tornado.stack_context異步環(huán)境中對回調函數(shù)上下文保存、異常處理
- tornado.testing單元測試
Tornado服務器的三個底層核心模塊
- httpserver 服務于web模塊的一個簡單的HTTP服務器的實現(xiàn)
Tornado的HTTPConnection類用來處理HTTP請求,包括讀取HTTP請求頭、讀取POST傳遞的數(shù)據(jù),調用用戶自定義的處理方法,以及把響應數(shù)據(jù)寫給客戶端的socket
- iostream 對非阻塞式的socket的封裝以便于常見讀寫操作
為了在處理請求時實現(xiàn)對socket的異步讀寫,Tornado實現(xiàn)了IOStream類用來處理socket的異步讀寫
- ioloop 核心的I/O循環(huán)
Tornado為了實現(xiàn)高并發(fā)和高性能,使用了一個IOLoop事件循環(huán)來處理socket的讀寫事件,IOLoop事件循環(huán)是基于Linux的epoll模型,可以高效地響應網(wǎng)絡事件,這是Tornado高效的基礎保證
設計模型
Tornado不僅僅是一個Web框架,它完整地實現(xiàn)了HTTP服務器和客戶端,再此基礎上提供了Web服務,它可分為四層:
-
Web框架:最上層,包括處理器、模板、數(shù)據(jù)庫連接、認證、本地化等Web框架所需功能
-
HTTP/HTTPS層:基于HTTP協(xié)議實現(xiàn)了HTTP服務器和客戶端
-
TCP層:實現(xiàn)TCP服務器負責數(shù)據(jù)傳輸
-
Event層:最底層、處理IO事件
使用Tornado可以方便地架構出各種類型的web服務器,以HTTP服務器為例來分析下web服務器的工作方式
一個請求處理的處理過程 -
服務器綁定bind到特定端口port,然后開始監(jiān)聽listen客戶端的請求
-
當客戶端連接connect到來時,會將請求發(fā)送給服務器
-
服務器處理請求完畢后返回響應結果給客戶端
當需要處理成千上萬的連接的時候,就會遇到典型的The C10K Program問題,常見的解決方案有
- 一個線程服務多個客戶端,使用非阻塞I/O和水平觸發(fā)的就緒通知
- 一個線程服務多個客戶端,使用非阻塞I/O和就緒改變時通知
- 一個服務線程服務于多個客戶端,使用異步I/O
- 一個服務線程服務于一個客戶端,使用阻塞I/O
- 將服務代碼編譯進內核
Tornado采用的方式是“多進程 + 非阻塞 + epoll模式”
總結
- 上一篇: Elasticsearch介绍
- 下一篇: Tornado基本使用