Tornado

引言

回想Django的部署方式

以Django爲表明的python web應用部署時採用wsgi協議與服務器對接(被服務器託管),而這類服務器一般都是基於多線程的,也就是說每個網絡請求服務器都會有一個對應的線程來用web應用(如Django)進行處理。html

考慮兩類應用場景

  1. 用戶量大,高併發前端

    如秒殺搶購、雙十一某寶購物、春節搶火車票python

  2. 大量的HTTP持久鏈接jquery

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

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

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

對於這兩種場景,一般基於多線程的服務器很難應對。django

 

Tornado

Tornado在設計之初就考慮到了性能因素,旨在解決C10K問題,這樣的設計使得其成爲一個擁有很是高性能的解決方案(服務器與框架的集合體)。編程

 

1 關於Tornado

知識點

  • 瞭解什麼是Tornado框架
  • 瞭解Tornado與Django的區別

 

 

1.1 Tornado是爲什麼物

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

特色:

  • 做爲Web框架,是一個輕量級的Web框架,相似於另外一個Python web框架Web.py,其擁有異步非阻塞IO的處理方式。
  • 做爲Web服務器,Tornado有較爲出色的抗負載能力,官方用nginx反向代理的方式部署Tornado和其它Python web應用框架進行對比,結果最大瀏覽量超過第二名近40%。

性能: Tornado有着優異的性能。它試圖解決C10k問題,即處理大於或等於一萬的併發,下表是和一些其餘Web框架與服務器的對比:

Tornado框架和服務器一塊兒組成一個WSGI的全棧替代品。單獨在WSGI容器中使用tornado網絡框架或者tornaod http服務器,有必定的侷限性,爲了最大化的利用tornado的性能,推薦同時使用tornaod的網絡框架和HTTP服務器

 

1.2 Tornado與Django

Django

Django是走大而全的方向,注重的是高效開發,它最出名的是其全自動化的管理後臺:只須要使用起ORM,作簡單的對象定義,它就能自動生成數據庫結構、以及全功能的管理後臺。

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

  • session功能
  • 後臺管理
  • ORM

Tornado

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

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

2 初識Tornado

知識點

  • Tornado的安裝
  • 瞭解Tornado的原理
  • 掌握Tornado的基本寫法
  • 掌握Tornado的基本模塊
    • tornado.web
    • tornado.ioloop
    • tornado.httpserver
    • tornado.options

 

2.1 安裝

自動安裝

  1. 查看本身當前的環境是否已安裝
    $ pip list

 

 

手動安裝

  1. 下載安裝包tornado-4.3.tar.gz(https://pypi.python.org/packages/source/t/tornado/tornado-4.3.tar.gz
    $ tar xvzf tornado-4.3.tar.gz $ cd tornado-4.3 $ python setup.py build $ sudo python setup.py install 

關於使用平臺的說明

Tornado should run on any Unix-like platform, although for the best performance and scalability only Linux (with epoll) and BSD (with kqueue) are recommended for production deployment (even though Mac OS X is derived from BSD and supports kqueue, its networking performance is generally poor so it is recommended only for development use). Tornado will also run on Windows, although this configuration is not officially supported and is recommended only for development use.

Tornado應該運行在類Unix平臺,在線上部署時爲了最佳的性能和擴展性,僅推薦Linux和BSD(由於充分利用Linux的epoll工具和BSD的kqueue工具,是Tornado不依靠多進程/多線程而達到高性能的緣由)。

對於Mac OS X,雖然也是衍生自BSD而且支持kqueue,可是其網絡性能一般不太給力,所以僅推薦用於開發。

對於Windows,Tornado官方沒有提供配置支持,可是也能夠運行起來,不過僅推薦在開發中使用。

 

使用tornado穿件事實聊天室

基於webSock  由於tornado內置有websocket

 

代碼

s1.py

import tornado
from tornado.web import Application
from tornado.web import RequestHandler
from tornado.websocket import WebSocketHandler

#定義一個類,繼承了RequestHandler類
# 用於處理用戶的連接顯示渲染頁面的功能
#表示此類使用的是HTTP協議
class IndexHandler(RequestHandler):

    def get(self, *args, **kwargs):
        # self.write('Hello World')
        self.render('index.html')

    def post(self, *args, **kwargs):
        user = self.get_argument('user')
        #給用戶返回信息
        self.write('成功')

WS_LIST = [] #定義一個列表,裏邊用於存放客戶端的連接

#定義一個類,繼承了WebSocketHandler類
#表示此類中使用了WebSocket協議,
class MessageHandler(WebSocketHandler):

    def open(self, *args, **kwargs):
        #self就是客戶端的連接,每來一條就要給類表中添加一個連接
        WS_LIST.append(self)
    #messges是用戶發送過來的數據
    def on_message(self, message):
        # self.close() 服務端主動斷開鏈接,客戶端的onclose方法自動執行
        #
        for ws in WS_LIST:
            #循環取出全部的連接,給每一個鏈接都寫入剛剛收到的信息
            ws.write_message(message)

    def on_close(self):
        # 若是客戶端斷開鏈接,那麼該函數就自動執行。
        WS_LIST.remove(self)



settings = {
    #配置文件,設置靜態文件的位置,模板的位置
    'template_path':'templates',
    'static_path':'static',
}
#
app = Application([
    (r"/index", IndexHandler),
    (r"/message", MessageHandler),
],**settings) #這裏注意路由關係寫在列表內,配置以打散的形式寫入

if __name__ == '__main__':
    #監聽本機的請求
    app.listen(address='0.0.0.0',port=9999)
  #啓動程序 tornado.ioloop.IOLoop.instance().start()

index.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Title</title>
    <style>
        .msg-item{
            padding: 5px;
            border: 1px;
            margin: 0 5px;
        }
    </style>
</head>
<body>
    <h1>首頁</h1>
    <div>
        <h2>發送消息</h2>
        <input id="msg" type="text"  /> <input type="button" value="發送" onclick="sendMsg()">
        <h2>接收消息</h2>
        <div id="container">

        </div>
    </div>

    <script src="/static/jquery-3.3.1.min.js"></script>
    <script>

        ws = new WebSocket('ws://192.168.12.55:9999/message');
        //建立一個websocket對象
        //實時的接收服務端發過來的數據
        ws.onmessage = function (event) {
            var tag = document.createElement('div');
            tag.className = 'msg-item';
            //獲取服務端發過來的數據,並將數據寫入到標籤中去
            tag.innerText = event.data;
            $('#container').append(tag);
        }
        ws.onclose = function (event) {
            // 服務端主動斷開了鏈接
        }
        //向服務端發送數據
        function sendMsg() {
            ws.send($('#msg').val());
        }

        // 客戶端要斷開鏈接
        // ws.close()
    </script>
</body>
</html>

 

 

 

 

 繼承他表示websocket協議

用tornando 中應用websocket實現了聊天室

前端代碼:(與上次一致)

 

後端代碼(筆記中)

 

 

服務端和客戶端如何斷開連接

  

user=self.get_argument("user")  這個既能夠從get中去數據也能從body中取數據

模板中的{{msg}}必需要穿, 無論有沒有值 不穿會報錯  (於django flaskd的區別)

 如何驗證

相關文章
相關標籤/搜索