Flask、Django、Tornado、FastAPI 之 Python Web 并发测试

Published on in Python with 0 views and 0 comments

目前Python Web生态圈中涌现出许许多多优秀的Web框架,投入生产最多的要属Flask和Django,Tornado有别于上述两种框架,它是Python界的一大异步网络框架,可以支撑上万级的连接,FastAPI则是这几个框架中的一个新秀,它是一款集成了Swagger文档的高性能Web框架。

对于这四种不同的Python Web框架,各有特点,一般适用于不同的业务场景。为了进一步了解他们的并发性能,我将在同样的系统环境下对他们依次进行压测。

Webbench

Webbench是一个网站测压工具,它能测试相同硬件上,不同服务的性能;以及不同硬件上同一个服务的运行状况。Webbench的标准测试可以向我们展示服务器的两项内容:每秒钟相应请求数每秒钟传输数据量。并且它最多支持模拟3W个并发连接测试服务器负载能力。

下载

通过GitHub下载源码

git clone https://github.com/EZLippi/WebBench

安装

sudo make && sudo make install PREFIX=your_path_to_webbench

压测命令

webbench -c 500 -t 5 http://127.0.0.1:5000/

可选参数

短参数长参数作用
-f--force不需要等待服务器响应
-r--reload发送重新加载请求
-t--time运行多长时间,单位:秒"
-p--proxy server:port使用代理服务器来发送请求
-c--clients创建多少个客户端,默认1个"
-9--http09使用 HTTP/0.9
-1--http10使用 HTTP/1.0 协议
-2--http11使用 HTTP/1.1 协议
--get使用 GET请求方法
--head使用 HEAD请求方法
--options使用 OPTIONS请求方法
--trace使用 TRACE请求方法
-?/-h--help打印帮助信息
-V--version显示版本号

代码

此处的代码均是框架官网的快速开始小案例,有需要的可以直接参考不同官网的示例代码。

Flask

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_flask():
    return 'Hello, flask!'

if __name__ == '__main__':
    app.run(host='0.0.0.0')

Django

安装完后直接运行

python3 manage.py runserver

Tornado

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

FastAPI

from fastapi import FastAPI

app = FastAPI()
@app.get("/")
def read_root():
    return {"Hello": "World"}

压测结果

Flask

5秒 500并发

image.png

5秒 1000并发

image.png

Django

1秒 500并发

image.png

Tornado

5秒 500并发

image.png

5秒 1000并发

image.png

FastAPI

5秒 500并发

image.png

5秒 1000并发

image.png

总结

测试结果会因为系统环境的不同会有偏差,Django的测试其实并不需要,因为其内置的服务器性能极低,一般会有替代方案做生产使用。从测试的截图结果来看,FastAPI的表现让我大开眼界,并发性能竟然超过了Tornado,也希望日后Python Web的生态圈能越来越优秀。


标题:Flask、Django、Tornado、FastAPI 之 Python Web 并发测试
作者:Jeffrey