tornado之異步web服務一

大部分Web應用(包括咱們以前的例子)都是阻塞性質的,也就是說當一個請求被處理時,這個進程就會被掛起直至請求完成。在大多數狀況下,Tornado處理的Web請求完成得足夠快使得這個問題並不須要被關注。然而,對於那些須要一些時間來完成的操做(像大數據庫的請求或外部API),這意味着應用程序被有效的鎖定直至處理結束,很明顯這在可擴展性上出現了問題。web

不過tornado給了咱們更好的方法來處理這種狀況。應用程序在等待第一個處理完成的過程當中,讓I/O循環打開以便服務於其餘客戶端,直處處理完成時啓動一個請求並給予反饋,而再也不是等待請求完成的過程當中掛起進程。數據庫

咱們首先構造一個阻塞性質的例子來看下:apache

在這個例子中咱們首先須要實例化一個HTTPClient類,而後調用對象的fetch方法。經過fetch方法咱們構建一個URLL來抓取阿里雲根據地區名獲取經緯度接口。網站會返回一個json的結果,咱們將這個json結果呈如今咱們的網頁上json

經過阿里雲查詢成都的經緯度併發

咱們的代碼構造以下:app

經過獲取網頁傳遞的參數a來獲得從查詢的城市,而且構造完整的URLresponse獲取到網頁反饋的信息而且反饋到網頁上異步

 

class indexHandler(tornado.web.RequestHandler):async

    def get(self, *args, **kwargs):ide

        query=self.get_argument('a').encode('utf-8')函數

 

        client=tornado.httpclient.HTTPClient()

        response=client.fetch("http://gc.ditu.aliyun.com/geocoding?"+urllib.urlencode({'a':query}))

        body=json.loads(response.body)

        self.write(response.body)

獲得的結果以下。

tornado的後臺打印中看到整個的響應時延是96.78ms.

[I 171231 14:44:18 web:2063] 200 GET /?a=%E6%88%90%E9%83%BD (127.0.0.1) 96.78ms

 

到這裏,咱們已經編寫了一個請求阿里雲反饋城市經緯的應用。可是隻有一個請求也就是能夠認爲是單線程應用,若是咱們有多個請求的時候,性能會如何呢?

咱們須要使用一個測試工具來測試大量請求的時候性能表現。這裏咱們用到siege工具進行測試。使用方法很簡單:

siege http://127.0.0.1:8000/?a=成都 -c10 -t10s

 

參數的解釋以下:-c表明的是設置的同時併發的用戶數。

       -c NUM, --concurrent=NUM

           This option allows you to set the concurrent number of users. The

           total number of users is technically limited to your computer's

           resources.

 

           You should not configure more users than your web server is

           configured to handle. For example, the default apache configuration

           is capped at 255 threads. If you run siege with -c 1024, then 769

           siege users are left waiting for an apache handler.

 

           For this reason, the default siege configuration is capped at 255

           users.  You can increase that number inside s

-t表明的是測試運行的時間,-t10s表明運行10秒的意思

-t NUMm, --time=NUMm

           This option is similar to --reps but instead of specifying the

           number of times each user should run, it specifies the amount of

           time each should run.

 

           The value format is "NUMm", where "NUM" is an amount of time and

           the "m" modifier is either S, M, or H for seconds, minutes and

           hours. To run siege for an hour, you could select any one of the

           following combinations: -t3600S, -t60M, -t1H.  The modifier is not

           case sensitive, but it does require no space between the number and

           itself.

 

執行結果以下:能夠看到成功發送請求65次。不到10秒的時間平均響應時間達到了1.03m秒,

root@zhf-maple:/home/zhf/桌面# siege http://127.0.0.1:8000/?a=成都 -c10 -t10s

** SIEGE 4.0.2

** Preparing 10 concurrent users for battle.

The server is now under siege...

Lifting the server siege...

Transactions:           65 hits

Availability:        74.71 %

Elapsed time:         9.27 secs

Data transferred:         0.01 MB

Response time:         1.03 secs

Transaction rate:         7.01 trans/sec

Throughput:         0.00 MB/sec

Concurrency:         7.21

Successful transactions:          65

Failed transactions:           22

Longest transaction:         1.40

Shortest transaction:         0.47

咱們加大同時複用的次數:在這裏設置爲20個併發用法。能夠看到平均相應時間直接翻倍成2.29秒

root@zhf-maple:/home/zhf/桌面# siege http://127.0.0.1:8000/?a=成都 -c20 -t10s

** SIEGE 4.0.2

** Preparing 20 concurrent users for battle.

The server is now under siege...

Lifting the server siege...

Transactions:           70 hits

Availability:        76.92 %

Elapsed time:         9.89 secs

Data transferred:         0.01 MB

Response time:         2.29 secs

Transaction rate:         7.08 trans/sec

Throughput:         0.00 MB/sec

Concurrency:        16.22

Successful transactions:          70

Failed transactions:           21

Longest transaction:         2.56

Shortest transaction:         0.10

若是將併發次數繼續往上擡升能夠看到響應時間跟隨一塊兒增長。當咱們增長到100個用戶的時候,平均響應時間變成了6.12秒。

root@zhf-maple:/home/zhf/桌面# siege http://127.0.0.1:8000/?a=成都 -c100 -t10s

** SIEGE 4.0.2

** Preparing 100 concurrent users for battle.

The server is now under siege...

Lifting the server siege...

Transactions:           71 hits

Availability:        78.02 %

Elapsed time:         9.49 secs

Data transferred:         0.01 MB

Response time:         6.12 secs

Transaction rate:         7.48 trans/sec

Throughput:         0.00 MB/sec

Concurrency:        45.77

Successful transactions:          71

Failed transactions:           20

Longest transaction:         9.39

Shortest transaction:         0.16

這種增加的速度對於同時大量用戶在線訪問的時候確定是沒法接收的。幸運的是,Tornado包含一個AsyncHTTPClient類,能夠執行異步HTTP請求。代碼修改以下。首先使用tornado.web.asynchronous裝飾器並在fetch增長回調函數。這個回調函數將在HTTP請求完成時被調用。並用response做爲參數。

class indexHandler(tornado.web.RequestHandler):

    @tornado.web.asynchronous

    def get(self, *args, **kwargs):

        query=self.get_argument('a').encode('utf-8')

 

        client=tornado.httpclient.AsyncHTTPClient()

        response=client.fetch("http://gc.ditu.aliyun.com/geocoding?"+urllib.urlencode({'a':query}),callback=self.on_response)

    def on_response(self,response):

        body=json.loads(response.body)

        self.write(response.body)

        self.finish()

 

咱們來看下性能如何:一樣設置-c10 -t10s。響應時間從以前的1.03秒降低到0.19秒。總共傳輸的次數以及每秒傳輸的次數也增長

root@zhf-maple:/home/zhf/桌面# siege http://127.0.0.1:8003/?a=成都 -c10 -t10s

** SIEGE 4.0.2

** Preparing 10 concurrent users for battle.

The server is now under siege...

Lifting the server siege...

Transactions:          211 hits

Availability:       100.00 %

Elapsed time:         9.36 secs

Data transferred:         0.00 MB

Response time:         0.19 secs

Transaction rate:        22.54 trans/sec

Throughput:         0.00 MB/sec

Concurrency:         4.39

Successful transactions:         211

Failed transactions:            0

Longest transaction:         0.25

Shortest transaction:         0.17

併發20個用戶的時候,響應時間從2.29秒降低爲0.22秒

root@zhf-maple:/home/zhf/桌面# siege http://127.0.0.1:8003/?a=成都 -c20 -t10s

** SIEGE 4.0.2

** Preparing 20 concurrent users for battle.

The server is now under siege...

Lifting the server siege...

Transactions:          389 hits

Availability:       100.00 %

Elapsed time:         9.23 secs

Data transferred:         0.01 MB

Response time:         0.22 secs

Transaction rate:        42.15 trans/sec

Throughput:         0.00 MB/sec

Concurrency:         9.38

Successful transactions:         389

Failed transactions:            0

Longest transaction:         0.44

Shortest transaction:         0.1

併發100個用戶的時候,響應時間從6.12變成了1.99秒。且成功傳輸次數增加到了362次

root@zhf-maple:/home/zhf/桌面# siege http://127.0.0.1:8003/?a=成都 -c100 -t10s

** SIEGE 4.0.2

** Preparing 100 concurrent users for battle.

The server is now under siege...

Lifting the server siege...

Transactions:          362 hits

Availability:       100.00 %

Elapsed time:         9.19 secs

Data transferred:         0.01 MB

Response time:         1.99 secs

Transaction rate:        39.39 trans/sec

Throughput:         0.00 MB/sec

Concurrency:        78.53

Successful transactions:         362

Failed transactions:            0

Longest transaction:         3.26

Shortest transaction:         0.21

從這裏能夠看到,併發帶來的性能提高是巨大的。特別是在多用戶同時訪問的情下。下一章將介紹併發的原理。

相關文章
相關標籤/搜索