“Tornado源碼解析篇”導讀索引

開始學習Tornado
服務器君一共花費了209.611 ms進行了6次數據庫查詢,努力地為您提供了這個頁面。
試試閱讀模式?希望聽取您的建議

最近花了2周時間斷斷續續地閱讀了 Tornado 的源碼,寫了“Tornado源碼解析”這個系列專題。由于寫得比較散,這里簡單做一個索引與導讀。

為什么要選擇 Tornado 這個框架?先給大家講一個小故事:

"[web.py inspired the] web framework we use at FriendFeed [and] the webapp framework that ships with App Engine..."

— Brett Taylor, co-founder of FriendFeed and original tech lead on Google App Engine

FriendFeed 創始人用了 web.py 作為他們的框架,然后愛上了web.py 。后來他發現web.py的一些不足,然后就創造了一個很像 web.py 的框架 Tornado,性能會強上一些。

更多關于 Tornado 的細節可以參看專題里面具體小節的內容,下面我們開始導讀。

1. 為什么要閱讀Tornado的源碼?

From: 為什么要閱讀Tornado的源碼?

Tornado 由前 google 員工開發,代碼非常精練,實現也很輕巧,加上清晰的注釋和豐富的 demo,我們可以很容易的閱讀分析 tornado. 通過閱讀 Tornado 的源碼,你將學到:

  • 理解 Tornado 的內部實現,使用 tornado 進行 web 開發將更加得心應手。
  • 如何實現一個高性能,非阻塞的 http 服務器。
  • 如何實現一個 web 框架。
  • 各種網絡編程的知識,比如 epoll
  • python 編程的絕佳實踐

2. 一覽眾山小

我們先了解 Tornado 的框架組成,才知道哪些部分是核心內容,應該重點看,哪些可以遲些再看。

From: 鳥瞰Tornado框架的設計模型

從這個圖,我們結合下面看,就知道我們應該讀哪些內容了。

1. Core web framework

  • tornado.web — 包含web框架的大部分主要功能,包含RequestHandler和Application兩個重要的類
  • tornado.httpserver — 一個無阻塞HTTP服務器的實現
  • tornado.template — 模版系統
  • tornado.escape — HTML,JSON,URLs等的編碼解碼和一些字符串操作
  • tornado.locale — 國際化支持

2. Asynchronous networking 底層模塊

  • tornado.ioloop — 核心的I/O循環
  • tornado.iostream — 對非阻塞式的 socket 的簡單封裝,以方便常用讀寫操作
  • tornado.httpclient — 一個無阻塞的HTTP服務器實現
  • tornado.netutil — 一些網絡應用的實現,主要實現TCPServer類

3. Integration with other services

  • tornado.auth — 使用OpenId和OAuth進行第三方登錄
  • tornado.database — 簡單的MySQL服務端封裝
  • tornado.platform.twisted — 在Tornado上運行為Twisted實現的代碼
  • tornado.websocket — 實現和瀏覽器的雙向通信
  • tornado.wsgi — 與其他python網絡框架/服務器的相互操作

4. Utilities

  • tornado.autoreload — 生產環境中自動檢查代碼更新
  • tornado.gen — 一個基于生成器的接口,使用該模塊保證代碼異步運行
  • tornado.httputil — 分析HTTP請求內容
  • tornado.options — 解析終端參數
  • tornado.process — 多進程實現的封裝
  • tornado.stack_context — 用于異步環境中對回調函數的上下文保存、異常處理
  • tornado.testing — 單元測試

要讀哪些內容?

你可以參看這篇文章來了解需要讀哪些文件:Tornado源碼必須要讀的幾個核心文件

Core web framework 部分,tornado.web 包含web框架的大部分主要功能,這個需要重點看,它包含RequestHandler和Application兩個重要的類。Application 是個單例,總攬全局路由,創建服務器負責監聽,并把服務器傳回來的請求進行轉發(__call__)。RequestHandler 是個功能很豐富的類,基本上 web 開發需要的它都具備了,比如redirect,flush,close,header,cookie,render(模板),xsrf,etag等等。關于這個模塊的解析,可以參看以下三篇文章:

接下來是 tornado.httpserver,一個無阻塞HTTP服務器的實現。從 web 跟蹤到 httpserver.py 和 tcpserver.py。這兩個文件主要是實現 http 協議,解析 header 和 body, 生成request,回調給 appliaction,一個經典意義上的 http 服務器(written in python)。眾所周知,這是個很考究性能的一塊(IO),所以它和其它很多塊都連接到了一起,比如 IOLoop,IOStream,HTTPConnection 等等。這里 HTTPConnection 是實現了 http 協議的部分,它關注 Connection 嘛,這是 http 才有的。至于監聽端口,IO事件,讀寫緩沖區,建立連接之類都是在它的下層--tcp里需要考慮的,所以,tcpserver 才是和它們打交道的地方。關鍵部分是 HTTP 層與 TCP 層的工作原理:

剩下的 tornado.template,tornado.escape 之類的可以先不閱讀,會使用就行。

接下來是 Asynchronous networking 底層模塊,特別是底層的網絡模塊。

tornado.ioloop 是核心的I/O循環,需要重點看。如果你用過 select/poll/epoll/libevent 的話,對它的處理模型應該相當熟悉。簡言之,就是一個大大的循環,循環里等待事件,然后處理事件。這是開發高性能服務器的常見模型,tornado 的異步能力就是在這個類里得到保證的:

然后是tornado.iostream,對非阻塞式的 socket 的簡單封裝,以方便常用讀寫操作。這個也是重要模塊。IOStream。顧名思義,就是負責IO的。說到IO,就得提緩沖區和IO事件。緩沖區的處理都在它自個兒類里,IO事件的異步處理就要靠 IOLoop 了:

如果有興趣,可以閱讀更多源碼,比如epoll.py。其實這個文件也沒干啥,就是聲明了一下服務器使用 epoll。選擇 select/poll/epoll/kqueue 其中的一種作為事件分發模型,是在 tornado 里自動根據操作系統的類型而做的選擇,所以這幾種接口是一樣的(當然效率不一樣):

  1. 預備知識:我讀過的對epoll最好的講解
  2. epoll與select/poll性能,CPU/內存開銷對比

讀完這些部分,就可以算是認為讀完 Tornado 的核心源碼了,當然還有許多許多的其它功能可以讀,但是主框架已經讀完,其它也就是枝葉部分了。這個專題也會慢慢完善下去,這里僅僅作個階段性導讀。

本文地址:http://www.zqhthc.tw/librarys/veda/detail/2566,歡迎訪問原出處。

不打個分嗎?

轉載隨意,但請帶上本文地址:

http://www.zqhthc.tw/librarys/veda/detail/2566

如果你認為這篇文章值得更多人閱讀,歡迎使用下面的分享功能。
小提示:您可以按快捷鍵 Ctrl + D,或點此 加入收藏

大家都在看

閱讀一百本計算機著作吧,少年

很多人覺得自己技術進步很慢,學習效率低,我覺得一個重要原因是看的書少了。多少是多呢?起碼得看3、4、5、6米吧。給個具體的數量,那就100本書吧。很多人知識結構不好而且不系統,因為在特定領域有一個足夠量的知識量+足夠良好的知識結構,系統化以后就足以應對大量未曾遇到過的問題。

奉勸自學者:構建特定領域的知識結構體系的路徑中再也沒有比學習該專業的專業課程更好的了。如果我的知識結構體系足以囊括面試官的大部分甚至吞并他的知識結構體系的話,讀到他言語中的一個詞我們就已經知道他要表達什么,我們可以讓他坐“上位”畢竟他是面試官,但是在知識結構體系以及心理上我們就居高臨下。

所以,閱讀一百本計算機著作吧,少年!

《算法導論(原書第2版)》 科曼(Cormen T.H.) (作者), 等 (作者, 譯者), 潘金貴 (譯者)

《算法導論(原書第2版)》一書深入淺出,全面地介紹了計算機算法。對每一個算法的分析既易于理解又十分有趣,并保持了數學嚴謹性。本書的設計目標全面,適用于多種用途。涵蓋的內容有:算法在計算中的作用,概率分析和隨機算法的介紹。本書專門討論了線性規劃,介紹了動態規劃的兩個應用,隨機化和線性規劃技術的近似算法等,還有有關遞歸求解、快速排序中用到的劃分方法與期望線性時間順序統計算法,以及對貪心算法元素的討論。本書還介紹了對強連通子圖算法正確性的證明,對哈密頓回路和子集求和問題的NP完全性的證明等內容。全書提供了900多個練習題和思考題以及敘述較為詳細的實例研究。

更多計算機寶庫...

英超直播吻球网