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

Updated on in Python with 1,312 views

目前 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

Responses
取消