Tornado基礎學習篇<一>
1.1 Tornado是什麼?
Tornado是使用Python編寫的一個強大的、可擴充套件的Web伺服器。它在處理嚴峻的網路流量時表現得足夠強健,但卻在建立和編寫時有著足夠的輕量級,並能夠被用在大量的應用和工具中。
我們現在所知道的Tornado是基於Bret Taylor和其他人員為FriendFeed所開發的網路服務框架,當FriendFeed被Facebook收購後得以開源。不同於那些最多隻能達到10,000個併發連線的傳統網路伺服器,Tornado在設計之初就考慮到了效能因素,旨在解決C10K問題,這樣的設計使得其成為一個擁有非常高效能的框架。此外,它還擁有處理安全性、使用者驗證、社交網路以及與外部服務(如資料庫和網站API)進行非同步互動的工具。
延伸閱讀:C10K問題
基於執行緒的伺服器,如Apache,為了傳入的連線,維護了一個作業系統的執行緒池。Apache會為每個HTTP連線分配執行緒池中的一個執行緒,如果所有的執行緒都處於被佔用的狀態並且尚有記憶體可用時,則生成一個新的執行緒。儘管不同的作業系統會有不同的設定,大多數Linux釋出版中都是預設執行緒堆大小為8MB。Apache的架構在大負載下變得不可預測,為每個開啟的連線維護一個大的執行緒池等待資料極易迅速耗光伺服器的記憶體資源。
大多數社交網路應用都會展示實時更新來提醒新訊息、狀態變化以及使用者通知,這就要求客戶端需要保持一個開啟的連線來等待伺服器端的任何響應。這些長連線或推送請求使得Apache的最大執行緒池迅速飽和。一旦執行緒池的資源耗盡,伺服器將不能再響應新的請求。
非同步伺服器在這一場景中的應用相對較新,但他們正是被設計用來減輕基於執行緒的伺服器的限制的。當負載增加時,諸如Node.js,lighttpd和Tornodo這樣的伺服器使用協作的多工的方式進行優雅的擴充套件。也就是說,如果當前請求正在等待來自其他資源的資料(比如資料庫查詢或HTTP請求)時,一個非同步伺服器可以明確地控制以掛起請求。非同步伺服器用來恢復暫停的操作的一個常見模式是當合適的資料準備好時呼叫回撥函式。我們將會在第五章講解回撥函式模式以及一系列Tornado非同步功能的應用。
自從2009年9月10日釋出以來,TornadoTornado已經獲得了很多社群的支援,並且在一系列不同的場合得到應用。除FriendFeed和Facebook外,還有很多公司在生產上轉向Tornado,包括Quora、Turntable.fm、Bit.ly、Hipmunk以及MyYearbook等。
總之,如果你在尋找你那龐大的CMS或一體化開發框架的替代品,Tornado可能並不是一個好的選擇。Tornado並不需要你擁有龐大的模型建立特殊的方式,或以某種確定的形式處理表單,或其他類似的事情。它所做的是讓你能夠快速簡單地編寫高速的Web應用。如果你想編寫一個可擴充套件的社交應用、實時分析引擎,或RESTful API,那麼簡單而強大的Python,以及Tornado正是為你準備的!
1.2快速入門
這裡我就不寫安裝步驟了,pip3 install tornado
hello,Tornado
import tornado from tornado import ioloop,httpserver from tornado.web import RequestHandler,url from tornado.options import define,options tornado.options.define("port",type=int,default=8002,help="伺服器客戶端") class IndexHandler(RequestHandler): def get(self): self.write("hello Tornado") #入口檔案 if __name__ == '__main__': tornado.options.parse_command_line() app = tornado.web.Application([(r"/",IndexHandler),], debug=True) http_server = tornado.httpserver.HTTPServer(app) http_server.listen(options.port) tornado.ioloop.IOLoop.current().start()
tornado的基礎web框架模組
RequestHandler
封裝了對應一個請求的所有資訊和方法,write(響應資訊)就是寫響應資訊的一個方法;對應每一種http請求方式(get、post等),把對應的處理邏輯寫進同名的成員方法中(如對應get請求方式,就將對應的處理邏輯寫在get()方法中),當沒有對應請求方式的成員方法時,會返回“405: Method Not Allowed”錯誤。
Application
Tornado Web框架的核心應用類,是與伺服器對接的介面,裡面儲存了路由資訊表,其初始化接收的第一個引數就是一個路由資訊對映元組的列表;其listen(埠)方法用來建立一個http伺服器例項,並繫結到給定埠(注意:此時伺服器並未開啟監聽)
Tornado核心IOLoop迴圈模組
tornado的核心io迴圈模組,封裝了Linux的epoll和BSD的kqueue,tornado高效能的基石。 以Linux的epoll為例,其原理如下圖:
IOLoop.current() 返回當前執行緒的IOLoop例項。
IOLoop.start() 啟動IOLoop例項的I/O迴圈,同時伺服器監聽被開啟。