摘要:實際上還是單進程阻塞運行的,即使在中配置了也無法實現(xiàn)多線程使用。多線程情況配置啟用多線程在中配置兩條測試路由先用瀏覽器訪問隨即立刻訪問可見兩次訪問是不同的線程處理的,不會出現(xiàn)堵塞的情況。
背景
由于目前在用的Flask項目涉及到一部分依賴Windows的處理,還無法遷移到linux平臺,那么在windows環(huán)境下,要怎么部署呢?
思路根據(jù)Flask官網(wǎng)介紹,由于Flask內(nèi)置的服務(wù)器性能不佳,推薦的主要的部署方式有如下幾種:
mod_wsgi (Apache)
獨立 WSGI 容器
Gunicorn
Tornado
Gevent
uWSGI
FastCGI
CGI
上述這些部署方式,僅Tornado是支持在windows情況下部署的,配合上Nginx可以達到比較好的效果。可已參考Nginx與tornado框架的并發(fā)評測。
但是在實際使用中發(fā)現(xiàn),tornado 的穩(wěn)定性雖然很高,但是在tornado上部署Flask,并不會有異步的效果。實際上還是單進程阻塞運行的,即使在Flask中配置了threaded = True也無法實現(xiàn)多線程使用。
Flask多線程情況配置啟用多線程:
# manage.py from flask_script import Server server = Server(host="0.0.0.0", threaded=True)
在Flask中配置兩條測試路由
import time @main.route("/test") def maintest(): return "hello world" @main.route("/sleep") def mainsleep(): time.sleep(60) return "wake up"
先用瀏覽器訪問sleep:
隨即立刻訪問 est:
可見兩次訪問是不同的線程處理的,不會出現(xiàn)堵塞的情況。
tornado + Flask多線程情況使用tornado托管:
from tornado.wsgi import WSGIContainer from tornado.httpserver import HTTPServer from tornado.ioloop import IOLoop from yourapplication import app http_server = HTTPServer(WSGIContainer(app)) http_server.listen(5000) IOLoop.instance().start()
先用瀏覽器訪問sleep:
隨即立刻訪問 est:
可以發(fā)現(xiàn),雖然tornado框架是支持異步的,但是由于實際上后臺的處理是同步的,從而無法實現(xiàn)異步的處理的效果。如果想后臺的處理也異步,則需要直接使用tornado來開發(fā)。
那么為什么使用tornado來托管flask呢?
Tornado 是一個開源的可伸縮的、非阻塞式的 web 服務(wù)器和工具集,它驅(qū)動了FriendFeed 。因為它使用了 epoll 模型且是非阻塞的,它可以處理數(shù)以千計的并發(fā)固定連接,這意味著它對實時 web 服務(wù)是理想的。把 Flask 集成這個服務(wù)是直截了當(dāng)?shù)?/pre>根據(jù)官網(wǎng)描述,其實也是為了彌足flask自帶服務(wù)器不穩(wěn)定的問題。
Flask高并發(fā)下的表現(xiàn)使用tsung進行壓測,壓力500:
Name | highest 10sec mean | lowest 10sec mean | Highest Rate | Mean Rate | Mean | Count |
---|---|---|---|---|---|---|
connect | 34.30 msec | 31.91 msec | 506 / sec | 356.60 / sec | 33.19 msec | 103908 |
page | 0.42 sec | 0.29 sec | 505 / sec | 356.32 / sec | 0.39 sec | 103782 |
request | 0.42 sec | 0.29 sec | 505 / sec | 356.32 / sec | 0.39 sec | 103782 |
session | 1mn 24sec | 10.64 sec | 11.4 / sec | 1.21 / sec | 14.24 sec | 362 |
Code | Highest Rate | Mean Rate | Total number |
---|---|---|---|
200 | 505 / sec | 356.32 / sec | 104792 |
Name | Highest Rate | Total number |
---|---|---|
error_abort | 0.5 / sec | 1 |
error_abort_max_conn_retries | 11.7 / sec | 362 |
error_connect_econnrefused | 58.6 / sec | 1667 |
可見,在500的并發(fā)下,效果不佳,有很多的鏈接拒絕。
Flask + Nginx在高并發(fā)下的表現(xiàn)使用tsung進行壓測,壓力500:
Name | highest 10sec mean | lowest 10sec mean | Highest Rate | Mean Rate | Mean | Count |
---|---|---|---|---|---|---|
connect | 0.20 sec | 30.95 msec | 1810.5 / sec | 626.43 / sec | 0.11 sec | 189853 |
page | 0.68 sec | 0.17 sec | 1810.1 / sec | 625.72 / sec | 0.40 sec | 189581 |
request | 0.68 sec | 0.17 sec | 1810.1 / sec | 625.72 / sec | 0.40 sec | 189581 |
Code | Highest Rate | Mean Rate | Total number |
---|---|---|---|
200 | 906.4 / sec | 196.08 / sec | 60689 |
502 | 1443.9 / sec | 430.02 / sec | 129006 |
Name | Highest Rate | Total number |
---|---|---|
error_abort | 0.5 / sec | 1 |
情況差不多,Flask服務(wù)器表現(xiàn)還算穩(wěn)定,那么嘗試增加后臺Flask服務(wù)器數(shù)量(通過多端口實現(xiàn)):
python manage.py runserver --port=8001 python manage.py runserver --port=8002 python manage.py runserver --port=8003 python manage.py runserver --port=8004
使用tsung進行壓測,壓力500,4個Flask服務(wù)器:
Name | highest 10sec mean | lowest 10sec mean | Highest Rate | Mean Rate | Mean | Count |
---|---|---|---|---|---|---|
connect | 0.18 sec | 32.57 msec | 3510.1 / sec | 639.92 / sec | 0.11 sec | 195154 |
page | 0.49 sec | 85.30 msec | 3512.1 / sec | 639.07 / sec | 0.35 sec | 194856 |
request | 0.49 sec | 85.30 msec | 3512.1 / sec | 639.07 / sec | 0.35 sec | 194856 |
Code | Highest Rate | Mean Rate | Total number |
---|---|---|---|
200 | 3510.1 / sec | 639.50 / sec | 194986 |
Name | Highest Rate | Total number |
---|---|---|
error_abort | 0.333333333333333 / sec | 1 |
這個效果妥妥的。
使用tsung進行壓測,壓力1000,4個Flask服務(wù)器:
Name | highest 10sec mean | lowest 10sec mean | Highest Rate | Mean Rate | Mean | Count |
---|---|---|---|---|---|---|
connect | 0.20 sec | 32.63 msec | 2983.8 / sec | 492.94 / sec | 98.56 msec | 150793 |
page | 0.57 sec | 90.00 msec | 2976.4 / sec | 491.31 / sec | 0.40 sec | 150275 |
request | 0.57 sec | 90.00 msec | 2976.4 / sec | 491.31 / sec | 0.40 sec | 150275 |
Code | Highest Rate | Mean Rate | Total number |
---|---|---|---|
200 | 2981.4 / sec | 488.92 / sec | 149556 |
502 | 92.5 / sec | 4.02 / sec | 925 |
Name | Highest Rate | Total number |
---|---|---|
error_abort | 0.333333333333333 / sec | 1 |
開始有一些502的超時錯誤了。
使用tsung進行壓測,壓力1000,4個tornado服務(wù)器:
Name | highest 10sec mean | lowest 10sec mean | Highest Rate | Mean Rate | Mean | Count |
---|---|---|---|---|---|---|
connect | 0.18 sec | 86.24 msec | 2052.1 / sec | 693.82 / sec | 0.14 sec | 208786 |
page | 0.52 sec | 0.24 sec | 2060.7 / sec | 693.34 / sec | 0.45 sec | 208606 |
request | 0.52 sec | 0.24 sec | 2060.7 / sec | 693.34 / sec | 0.45 sec | 208606 |
Code | Highest Rate | Mean Rate | Total number |
---|---|---|---|
200 | 2056.6 / sec | 693.67 / sec | 208703 |
在并發(fā)1000的情況下,是否使用tornado托管Flask效果差不多。
結(jié)論根據(jù)上述測試,直接使用Flask服務(wù)器的話,由于并發(fā)處理較弱,會有各種超時或者連接拒絕的錯誤。通過搭配Nginx來進行緩沖,通過增加后端服務(wù)器數(shù)來提供并發(fā)處理量。
所以最終選擇了Nginx+后臺4個Flask服務(wù)器的方式。由于目前Flask項目全體用戶只有幾千,目前并發(fā)情況很低,該方式完全滿足使用。
如果在更大型項目中,并發(fā)上萬,建議還是考慮想辦法遷移至Liunx環(huán)境,通過官方建議的方式部署。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/43145.html
摘要:實際上還是單進程阻塞運行的,即使在中配置了也無法實現(xiàn)多線程使用。多線程情況配置啟用多線程在中配置兩條測試路由先用瀏覽器訪問隨即立刻訪問可見兩次訪問是不同的線程處理的,不會出現(xiàn)堵塞的情況。 背景 由于目前在用的Flask項目涉及到一部分依賴Windows的處理,還無法遷移到linux平臺,那么在windows環(huán)境下,要怎么部署呢? 思路 根據(jù)Flask官網(wǎng)介紹,由于Flask內(nèi)置的服務(wù)器...
摘要:在平臺部署基于的網(wǎng)站是一件非常折騰的事情,平臺下有很多選擇,本文記錄了部署到的主要步驟,希望對你有所幫助。下載后運行,搜索,分別安裝。使用命令可以將其移除。在中你可以使用來快捷開發(fā)并部署程序,真正讓你一鍵無憂。 在 Windows 平臺部署基于 Python 的網(wǎng)站是一件非常折騰的事情,Linux/Unix 平臺下有很多選擇,本文記錄了 Flask 部署到 IIS 的主要步驟,希望對你...
摘要:接收用戶請求并分析請求的。執(zhí)行函數(shù)并生成響應(yīng),返回給瀏覽器。這個過程我們稱為注冊路由,路由負責(zé)管理和函數(shù)之間的映射,而這個函數(shù)則被稱為視圖函數(shù)。文件是一個名為的文本文件,它存儲了項目中提交時的忽略文件規(guī)則清單。 flask簡述 Flask 是一個基于 Python 開發(fā)并且依賴 jinja2 模板和 Werkzeug WSGI 服務(wù)的一個微型框架,對于 Werkzeug 本質(zhì)是 Soc...
閱讀 1226·2023-04-25 15:53
閱讀 2101·2021-11-19 09:40
閱讀 3488·2021-10-11 10:59
閱讀 2066·2019-08-30 15:55
閱讀 1955·2019-08-30 15:54
閱讀 2293·2019-08-29 13:03
閱讀 2754·2019-08-28 18:17
閱讀 1510·2019-08-27 10:51