Flask性能优化对比
基于Flask的网关:Flask,Uwsgi,Gevent,Gunicorn(gevent),Tornado,Twisted
!/usr/bin/python
-- coding:utf-8 --
##################################################
美颜Feed在线推荐系统
作者:志恩
时间:2018-10-17
网关性能对比 python index.py [1,2,3,4,5,6,7,8,9]
##################################################
import os
import sys
from flask import Flask
app = Flask(name)
port = 5000
debug = True
def hello() :
return "Congraduation!!! It Works!!!"
@app.route('/')
def index() :
return hello()
flask
def flask(p = 9090) :
print("flask is running on: localhost:%d", p)
app.run('0.0.0.0', port = p, debug = debug)
uwsgi
def uwsgi(p = 9191) :
print("uwsgi is running on: localhost:%d", p)
# os.system("uwsgi uwsgi.ini")
os.system("uwsgi --http :" + str(p) + " --wsgi-file index.py --callable app --processes 4 --threads 10 --master --max-request 100000 --stats :9191")
gevent
from gevent.pywsgi import WSGIServer
def gevent(p = 9292) :
print("gevent is running on: localhost:%d", p)
http_server = WSGIServer(('', p), app)
http_server.serve_forever()
gunicorn
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from tornado.options import define, options
def gunicorn(p = 9393) :
print("gunicorn is running on: localhost:%d", p)
# os.system("gunicorn -c gunicorn.py index:app")
os.system("gunicorn -b0.0.0.0:" + str(p) + " -w4 -k gevent index:app")
tornado
def tornado(p = 9494) :
print("tornado is running on: localhost:%d", p)
define('port', type = int, default = p)
define('mode', default = 'debug')
options.parse_command_line()
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(options.port)
IOLoop.instance().start()
twisted
from twisted.web import server, resource
from twisted.internet import reactor, endpoints
class Counter(resource.Resource) :
isLeaf = True
numberRequests = 0
def render_GET(self, request) :
request.setHeader(b"content-type", b"text/plain")
content = index()
return content.encode("ascii")
def twisted(p = 9595) :
print("twisted is running on: localhost:%d", p)
endpoints.serverFromString(reactor, "tcp:" + str(p)).listen(server.Site(Counter()))
reactor.run()
falcon
import falcon
class ThingsResource(object) :
def on_get(self, req, resp) :
resp.body = ('hello falcon')
appfalcon = falcon.API()
appfalcon.add_route('/', ThingsResource())
def falcon(p = 9696) :
print("falcon is running on: localhost:%d", p)
os.system("gunicorn -b0.0.0.0:" + str(p) + " -w4 -k gevent index:appfalcon")
sanic
from sanic import Sanic
from sanic.response import json, text
appsanic = Sanic()
@appsanic.route('/')
async def sanicindex(request) :
return text(hello())
def sanic(p = 9797) :
print("sanic is running on: localhost:%d", p)
appsanic.run(host = '0.0.0.0', port = p, workers = 4, debug = debug)
vibora 暂不支持python3.7,可以在3.6运行
if sys.version_info < (3, 7) :
from vibora import Vibora, logging
from vibora.responses import Response
appvibora = Vibora()
@appvibora.route('/')
async def viboraindex() :
return Response(bytes(index(), 'utf8'))
def log_handler(msg, level) :
# Redirecting the msg and level to logging library.
getattr(logging, level)(msg)
print(f'Msg: {msg} / Level: {level}')
def vibora(p = 9898) :
print("vibora is running on: localhost:%d", p)
appvibora.run(host = '0.0.0.0', port = p, debug = debug)
else :
def vibora(p = 9898) :
print("vibora is not running : python is not 3.6")
if name == 'main' :
if len(sys.argv) > 1 :
if sys.argv[1] == '1' : flask(port)
if sys.argv[1] == '2' : uwsgi(port)
if sys.argv[1] == '3' : gevent(port)
if sys.argv[1] == '4' : gunicorn(port)
if sys.argv[1] == '5' : tornado(port)
if sys.argv[1] == '6' : twisted(port)
if sys.argv[1] == '7' : falcon(port)
if sys.argv[1] == '8' : sanic(port)
if sys.argv[1] == '9' : vibora(port)
else :
flask(port)
Flask
Uwsgi
Gunicorn(gevent)
Tornado
Twisted
Gevent
非Flask Web框架:Falcon,Sanic,Vibora
Falcon
Sanic
Vibora
结论
1、在MAC环境下,用siege测试,相同的并发和请求数,Sanic和Uwsgi的表现遥遥领先,测试几十遍,sanic的QPS惊人的可以彪到7K以上,还要优化空间,Uwsgi参数优化后最大也可以到4K以上,其他框架表现平平,其中网络极力推荐的Tornado和Gunicorn(gevent)也没有Sanic出色。
2、在Mac和其他Linux环境中,用wrk测试,Vibora的表现艳压群芳,无与伦比。
Mac OS 10.14 + Python3.6.7
wrk -t100 -c1000 -d10s http://localhost:5000/
Index
Frameworks
Requests/Sec
Version
1 Flask
1031.42
1.0.2
2 uWSGI
801.69
2.0.17.1
3 Gevent
2220.93
1.3.7
4 Gunicorn(gevent)
3666.68
19.9.0
5 Tornado
1539.63
5.1.1
6 Twisted
4006.71
18.9.0
7 Falcon
4697.89
1.4.1
8 Sanic
3068.29
0.8.3
9 Vibora
15316.90
0.0.6
siege -c100 -r10000 -t10s http://localhost:5000/
Index
Frameworks
Requests/Sec
Version
1 Flask
998.17
1.0.2
2 uWSGI
854.09
2.0.17.1
3 Gevent
1650.11
1.3.7
4 Gunicorn(gevent)
1671.60
19.9.0
5 Tornado
1137.27
5.1.1
6 Twisted
1765.65
18.9.0
7 Falcon
1640.38
1.4.1
8 Sanic
1697.91
0.8.3
9 Vibora
2225.55
0.0.6
Ubuntu18 + Python3.6.7
wrk -t100 -c1000 -d10s http://localhost:5000/
Index
Frameworks
Requests/Sec
Version
1 Flask
348.32
1.0.2
2 uWSGI
727.01
2.0.17.1
3 Gevent
868.29
1.3.7
4 Gunicorn(gevent)
2300.19
19.9.0
5 Tornado
693.61
5.1.1
6 Twisted
2059.27
18.9.0
7 Falcon
3041.84
1.4.1
8 Sanic
1158.95
0.8.3
9 Vibora
4477.26
0.0.6
siege -c100 -r10000 -t10s http://localhost:5000/
Index
Frameworks
Requests/Sec
Version
1 Flask
358.53
1.0.2
2 uWSGI
899.25
2.0.17.1
3 Gevent
598.06
1.3.7
4 Gunicorn(gevent)
1112.11
19.9.0
5 Tornado
503.71
5.1.1
6 Twisted
972.32
18.9.0
7 Falcon
1143.52
1.4.1
8 Sanic
807.30
0.8.3
9 Vibora
767.14
0.0.6
Debian9 + Python3.6.7
wrk -t100 -c1000 -d10s http://localhost:5000/
Index
Frameworks
Requests/Sec
Version
1 Flask
347.30
1.0.2
2 uWSGI
462.69
2.0.17.1
3 Gevent
904.53
1.3.7
4 Gunicorn(gevent)
2362.21
19.9.0
5 Tornado
736.68
5.1.1
6 Twisted
2135.74
18.9.0
7 Falcon
3028.23
1.4.1
8 Sanic
1208.67
0.8.3
9 Vibora
4888.87
0.0.6
siege -c100 -r10000 -t10s http://localhost:5000/
Index
Frameworks
Requests/Sec
Version
1 Flask
419.40
1.0.2
2 uWSGI
1074.95
2.0.17.1
3 Gevent
660.53
1.3.7
4 Gunicorn(gevent)
1093.92
19.9.0
5 Tornado
572.77
5.1.1
6 Twisted
1041.45
18.9.0
7 Falcon
1181.62
1.4.1
8 Sanic
908.83
0.8.3
9 Vibora
756.53
0.0.6
Centos7.5 + Python3.6.7
wrk -t100 -c1000 -d10s http://localhost:5000/
Index
Frameworks
Requests/Sec
Version
1 Flask
337.44
1.0.2
2 uWSGI
756.72
2.0.17.1
3 Gevent
817.57
1.3.7
4 Gunicorn(gevent)
1952.39
19.9.0
5 Tornado
587.53
5.1.1
6 Twisted
1820.75
18.9.0
7 Falcon
2655.53
1.4.1
8 Sanic
1081.31
0.8.3
9 Vibora
4011.29
0.0.6
siege -c100 -r10000 -t10s http://localhost:5000/
Index
Frameworks
Requests/Sec
Version
1 Flask
336.62
1.0.2
2 uWSGI
918.54
2.0.17.1
3 Gevent
450.48
1.3.7
4 Gunicorn(gevent)
1294.98
19.9.0
5 Tornado
410.35
5.1.1
6 Twisted
949.29
18.9.0
7 Falcon
884.20
1.4.1
8 Sanic
665.61
0.8.3
9 Vibora
956.35
0.0.6
图表
地址:https://datastudio.google.com/open/1YCVHX0qyoGx2lZaqzQA979c28G6Fxr1-
综合下来,Vibora, Falcon, Gunicorn 整体表现不错,进入三强。
尴尬的是:尽管Sanic在各平台表现也很好,但是整体下来没有进入三强,很可惜。。。想哭
Flask性能优化对比的更多相关文章
- laravel 5.1 性能优化对比 - 框架提供的方法
写了一个项目发现性能不如人意. 于是便测试下, 看下性能瓶颈在什么地方. 使用 ab -n 20 http://www.lartest.com/ 软件环境: OS : windows 8.1 CPU: ...
- JDBC插入性能优化对比
今天对Insert进行了性能测试,结果反差很大,平时都是单条插入,虽然性能要求没有那么高,但是突然在项目中,人家给定时间内完成,这就尴尬了. 优化数据库,优化服务器,优化代码,反正通过各种优化提高数据 ...
- Redis各种数据结构性能数据对比和性能优化实践
很对不起大家,又是一篇乱序的文章,但是满满的干货,来源于实践,相信大家会有所收获.里面穿插一些感悟和生活故事,可以忽略不看.不过听大家普遍的反馈说这是其中最喜欢看的部分,好吧,就当学习之后轻松一下. ...
- [评测]低配环境下,PostgresQL和Mysql读写性能简单对比(欢迎大家提出Mysql优化意见)
[评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲 ...
- 针对特定网站scrapy爬虫的性能优化
在使用scrapy爬虫做性能优化时,一定要根据不同网站的特点来进行优化,不要使用一种固定的模式去爬取一个网站,这个是真理,以下是对58同城的爬取优化策略: 一.先来分析一下影响scrapy性能的set ...
- Web性能优化:What? Why? How?
为什么要提升web性能? Web性能黄金准则:只有10%~20%的最终用户响应时间花在了下载html文档上,其余的80%~90%时间花在了下载页面组件上. web性能对于用户体验有及其重要的影响,根据 ...
- Web性能优化:图片优化
程序员都是懒孩子,想直接看自动优化的点:传送门 我自己的Blog:http://cabbit.me/web-image-optimization/ HTTP Archieve有个统计,图片内容已经占到 ...
- JavaScript性能优化
如今主流浏览器都在比拼JavaScript引擎的执行速度,但最终都会达到一个理论极限,即无限接近编译后程序执行速度. 这种情况下决定程序速度的另一个重要因素就是代码本身. 在这里我们会分门别类的介绍J ...
- 前端性能优化的另一种方式——HTTP2.0
最近在读一本书叫<web性能权威指南>谷歌公司高性能团队核心成员的权威之作. 一直听说HTTP2.0,对此也仅仅是耳闻,没有具体研读过,这次正好有两个篇章,分别讲HTTP1.1和HTTP2 ...
随机推荐
- 企业级中带你ELK如何实时收集分析Mysql慢查询日志
什么是Mysql慢查询日志? 当SQL语句执行时间超过设定的阈值时,便于记录到指定的日志文件中或者表中,所有记录称之为慢查询日志 为什么要收集Mysql慢查询日志? 数据库在运行期间,可能会存在这很多 ...
- 咸鱼入门到放弃2--Servlet
Tomcat作为一款常用的servlet容器,其模型中包含了context容器对servlet行进管理. Servlet程序是由WEB服务器调用,web服务器收到客户端的Servlet访问请求后: ① ...
- CodeForces 528D Fuzzy Search 多项式 FFT
原文链接http://www.cnblogs.com/zhouzhendong/p/8782849.html 题目传送门 - CodeForces 528D 题意 给你两个串$A,B(|A|\geq| ...
- Windows Server 2008 R2 修改远程桌面服务RDP默认端口及相应的防火墙配置
修改以下两个注册表项当中的默认端口3389为自定义端口: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wd ...
- JavaScript DOM事件模型
早期由于浏览器厂商对于浏览器市场的争夺,各家浏览器厂商对同一功能的JavaScript的实现都不进相同,本节内容介绍JavaScript的DOM事件模型及事件处理程序的分类. 1.DOM事件模型.DO ...
- The Water Bowls [POJ3185] [开关问题]
题意 一串长度为20的0,1数列,每次翻转i,会影响i-1,i+1,也被翻转,最少翻转成0的步骤数是多少? Sample Input 0 0 1 1 1 0 0 1 1 0 1 1 0 0 0 0 0 ...
- 微信公众号_订阅号_access_token_创建菜单_菜单name+表情
全局唯一接口调用凭据 access_token 用于接口调用的一个必要参数 有了 access_token 就能实现所有的接口 特点: 1. 有效期为 2 小时,所以 2 小时要更新一次,提前 5 ...
- Java课程寒假之回答问题:如何将你的兴趣化为可以立足于社会的资本
在学校的时候干过几次兼职,算是无聊时候的外快吧,有一次是去辅导机构,在考试期间监考学生,前后大概四个小时,最后拿了四十五并且管了一顿饭,不得不说,小学生是真的皮,考试的时候有的爱讲话,有的是写完之后开 ...
- HTTP学习总结
首先是一张总结的图: 对各个不同的通信进行解分: 1.http通信详解 2.cookie通信图: 3.cookie管理的session信息 4.token通信
- C#基础概念总结
C#基础概念总结 1..NET Framework概念 2. C#的含义: 3.什么是面向对象编程: 4.Visual Studio开发工具: 5..NET程序运行的机制: 1..Net Framew ...