4.Tornado源碼必須要讀的幾個核心文件----瞭解Tornado的大致工作機制


前面我們看了一些關於 Tornado 的總體框架設計圖,還有一些模塊設計。比如3.大概瞭解Tornado框架的設計模型 裏面的文件組織,真的不少,那麼我們應該具體去讀哪幾個文件呢?

爲了方便,約定$root指帶tornado的根目錄。總的來說,要用tornado完成一個網站的構建,其實主要需要以下幾個文件:

  • $root/tornado/web.py
  • $root/tornado/httpserver.py
  • $root/tornado/tcpserver.py
  • $root/tornado/ioloop.py
  • $root/tornado/iostream.py
  • $root/tornado/platfrom/epoll.py
  • $root/app.py

另外可能還需要一些功能庫的支持而需要引入的文件就不列舉了,比如util和httputil之類的。來看看每個文件的作用。

  1. app.py 是自己寫的,內容就如 tornado 的 readme 文檔裏給的示例一樣,定義路由規則和 handler,然後創建 application,發起 server 監聽,服務器就算跑起來了。
  2. 緊接着就是 web.py。其中定義了 Application 和 RequestHandler 類,在 app.py 裏直接就用到了。Application 是個單例,總攬全局路由,創建服務器負責監聽,並把服務器傳回來的請求進行轉發(__call__)。RequestHandler 是個功能很豐富的類,基本上 web 開發需要的它都具備了,比如redirect,flush,close,header,cookie,render(模板),xsrf,etag等等
  3. 從 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 纔是和它們打交道的地方,到時候分析起來估計很麻煩
  4. 先說這個IOStream。顧名思義,就是負責IO的。說到IO,就得提緩衝區和IO事件。緩衝區的處理都在它自個兒類裏,IO事件的異步處理就要靠 IOLoop 了。
  5. 然後是 IOLoop。如果你用過 select/poll/epoll/libevent 的話,對它的處理模型應該相當熟悉。簡言之,就是一個大大的循環,循環裏等待事件,然後處理事件。這是開發高性能服務器的常見模型,tornado 的異步能力就是在這個類裏得到保證的
  6. 最後是 epoll.py。其實這個文件也沒幹啥,就是聲明瞭一下服務器使用 epoll。選擇 select/poll/epoll/kqueue 其中的一種作爲事件分發模型,是在 tornado 裏自動根據操作系統的類型而做的選擇,所以這幾種接口是一樣的(當然效率不一樣),出於簡化,直接就epoll吧^_^
  7. PS。如果你是一個細節控,可能會注意到 tornado 裏的回調 callback 函數都不是直接使用的,而是使用 stack_context.wrap 進行了封裝。但據我觀察,封裝前後沒多大差別(指邏輯流程),函數的參數也不變。但根據它代碼裏的註釋,這個封裝還是相當有用的:

Use this whenever saving a callback to be executed later in a different execution context (either in a different thread or asynchronously in the same thread).

所以,我猜,是使用了獨有的context來保證在不同環境也能很好的執行。猜測而已,我也沒細想,以後有時間再看好,最有用一個簡單的流程來做結。

發佈了13 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章