目前 Python Web 生态圈中涌现出许许多多优秀的 Web 框架,投入生产最多的要属 Flask 和 Django,Tornado 有别于上述两种框架,它是 Python 界的一大异步网络框架,可以支撑上万级的连接,FastAPI 则是这几个框架中的一个新秀,它是一款集成了 Swagger 文档的高性能 Web 框架。
对于这四种不同的 Python Web 框架,各有特点,一般适用于不同的业务场景。为了进一步了解他们的并发性能,我将在同样的系统环境下对他们依次进行压测。
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 | 显示版本号 |
此处的代码均是框架官网的快速开始小案例,有需要的可以直接参考不同官网的示例代码。
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')
安装完后直接运行
python3 manage.py runserver
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()
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
测试结果会因为系统环境的不同会有偏差,Django 的测试其实并不需要,因为其内置的服务器性能极低,一般会有替代方案做生产使用。从测试的截图结果来看,FastAPI 的表现让我大开眼界,并发性能竟然超过了 Tornado,也希望日后 Python Web 的生态圈能越来越优秀。