Flask 是 WSGI 框架,放到 uvicorn 这类 ASGI 服务器上有什么用?吞吐量会变好吗?能不能因此支持 WebSocket?这篇用真实的 ApacheBench 压测与 WebSocket 握手,把这两个问题的答案量出来。
[轻量接口 /hello]
gunicorn sync × 4 个 worker(WSGI) 3213 请求/秒 | 平均 10.0 ms(32 并发)| p99 26 ms | 失败 0
gunicorn gthread × 4 个 worker × 4 线程(WSGI) 3335 请求/秒 | 平均 9.6 ms(32 并发)| p99 23 ms | 失败 0
uvicorn × 4 个进程 + a2wsgi(ASGI) 5992 请求/秒 | 平均 5.3 ms(32 并发)| p99 11 ms | 失败 0
uvicorn × 4 个进程 + asgiref WsgiToAsgi(ASGI) 3343 请求/秒 | 平均 9.6 ms(32 并发)| p99 25 ms | 失败 0
[有点计算的接口 /work(2 万次乘加)]
gunicorn sync × 4 个 worker(WSGI) 2797 请求/秒 | 平均 11.4 ms(32 并发)| p99 23 ms | 失败 0
gunicorn gthread × 4 个 worker × 4 线程(WSGI) 2592 请求/秒 | 平均 12.3 ms(32 并发)| p99 23 ms | 失败 0
uvicorn × 4 个进程 + a2wsgi(ASGI) 2861 请求/秒 | 平均 11.2 ms(32 并发)| p99 27 ms | 失败 0
uvicorn × 4 个进程 + asgiref WsgiToAsgi(ASGI) 2898 请求/秒 | 平均 11.0 ms(32 并发)| p99 25 ms | 失败 0上一篇:同步代码阻塞异步请求;下一篇:WSGI 到 ASGI 的适配。
压测工具是系统自带的 ApacheBench,与被测服务同机运行,每个数字只测一次。
对 /ws 发 WebSocket 握手 → WebSocketBadStatusException: Handshake status 403 None -+-+- {'content-length': '0'} -+-+- None
同一路径的普通 HTTP GET → 200 plain http route