Flask性能优化对比

时间:2021-11-04 21:36:08

基于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在各平台表现也很好,但是整体下来没有进入三强,很可惜。。。想哭