Tornado框架的知識系列

 

 

 

 

Tornado介紹

 

1.Tornado介紹

Tornado全稱Tornado Web Server,是一個用Python語言寫成的Web服務器兼Web應用框架,由FriendFeed公司在本身的網站FriendFeed中使用,被Facebook收購之後框架在2009年9月以開源軟件形式開放給大衆。python

特色:nginx

做爲Web框架,是一個輕量級的Web框架,其擁有異步非阻塞IO的處理方式。web

做爲Web服務器,Tornado有較爲出色的抗負載能力,官方用nginx反向代理的方式部署Tornado和其它Python web應用框架進行對比,結果最大瀏覽量超過第二名近40%。數據庫

性能:django

Tornado有着優異的性能。它試圖解決C10k問題,即處理大於或等於一萬的併發。
Tornado框架和服務器一塊兒組成一個WSGI的全棧替代品。單獨在WSGI容器中使用tornado網絡框架或者tornaod http服務器,有必定的侷限性,爲了最大化的利用tornado的性能,推薦同時使用tornaod的網絡框架和HTTP服務器。編程

2.應用場景

1,用戶量大,高併發
如秒殺搶購、雙十一某寶購物、春節搶火車票服務器

2,大量的HTTP持久鏈接
使用同一個TCP鏈接來發送和接收多個HTTP請求/應答,而不是爲每個新的請求/應答打開新的鏈接的方法。網絡

對於HTTP 1.0,能夠在請求的包頭(Header)中添加Connection: Keep-Alive。session

對於HTTP 1.1,全部的鏈接默認都是持久鏈接。

併發

3.Tornado與Django

Django

Django是走的大而全的方向,注重的是高效開發,

它最出名的是其全自動化的管理後臺:只須要使用起ORM,作簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理後臺。

Django提供的方便,也意味着Django內置的ORM跟框架內的其餘模塊耦合程度高,應用程序必須使用Django內置的ORM,不然就不能享受到框架內提供的種種基於其ORM的便利。

  • session功能
  • 後臺管理
  • ORM

Tornado

Tornado走的是少而精的方向,注重的是性能優越,它最出名的是異步非阻塞的設計方式。

  • HTTP服務器
  • 異步編程
  • WebSockets

4,簡單的Tornado案例

import tornado.web
import tornado.ioloop

class IndexHandler(tornado.web.RequestHandler):
    """主路由處理類"""
    def get(self):
        """對應http的get請求方式"""
        self.write("Hello Python Tornado!")

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框架的核心應用類,是與服務器對接的接口,裏面保存了路由信息表,其初始化接收的第一個參數就是一個路由信息映射元組的列表;其listen(端口)方法用來建立一個http服務器實例,並綁定到給定端口(注意:此時服務器並未開啓監聽)

5,Tornado核心IOLoop循環模塊

tornado的核心io循環模塊,封裝了Linux的epoll和BSD的kqueue,tornado高性能的基石。 以Linux的epoll爲例,其原理以下圖:

 

 

 詳細圖

  • IOLoop.current() 返回當前線程的IOLoop實例。

  • IOLoop.start() 啓動IOLoop實例的I/O循環,同時服務器監聽被打開。

6,Tornado Web程序編寫思路

  • 1,建立web應用實例對象,第一個初始化參數爲路由映射列表。
  • 2,定義實現路由映射列表中的handler類。
  • 3,建立服務器實例,綁定服務器端口。
  • 4,啓動當前線程的IOLoop。
相關文章
相關標籤/搜索