bigywater.tech
Flask · 171

Flask Development Server 与生产服务器

flask run 为什么不能用在生产?它真的慢吗?和 gunicorn 差在哪?这篇用真实的压测把速度、并发、重载与进程模型逐项对比,答案和「它慢所以不能用」可能不一样。

2224 vs 3673
轻量接口的请求/秒:开发服务器与 gunicorn sync×4
33 秒
--without-threads 的开发服务器处理 64 个各等 0.5 秒的请求的总耗时
自动重载
开发服务器改文件会重启,gunicorn 默认不会

启动警告

实测 · 本机执行输出
   ['WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.']

上一篇:压测下的全局状态问题;下一篇:Gunicorn 启动 Flask。

吞吐与并发

实测 · 本机执行输出
  flask run(开发服务器,默认多线程)             /hello   2224 请求/秒(p99 24 ms,失败 0) | /wait 64 个请求总耗时   1.6 秒
  flask run --without-threads        /hello     78 请求/秒(p99 425 ms,失败 0) | /wait 64 个请求总耗时  33.3 秒
  gunicorn sync × 4                  /hello   3673 请求/秒(p99 24 ms,失败 0) | /wait 64 个请求总耗时   8.6 秒
  gunicorn gthread 2 × 8             /hello   3024 请求/秒(p99 16 ms,失败 0) | /wait 64 个请求总耗时   3.1 秒

压测工具是系统自带的 ApacheBench,与被测服务同机运行,每个数字只测一次。

自动重载

实测 · 本机执行输出
  改文件之前 → 'hi';改文件后 0.9 秒内请求得到 → 'hi v2'(重载器重启了进程)
  gunicorn(没有 --reload):改文件之前 'hi',2 秒之后 'hi'(不会自动重载)

进程模型

实测 · 本机执行输出
  flask run(开发服务器,默认多线程)             相关进程数(含 master / 父进程)1
  gunicorn sync × 4                  相关进程数(含 master / 父进程)5

分步演示

Flask 开发服务器与生产服务器
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动。Werkzeug 开发服务器、gunicorn、ApacheBench
    • 没有验证:开发服务器对恶意输入(超大请求头、慢客户端)的处理、HTTP/1.1 keep-alive 与分块传输的完整支持、TLS 终止(开发服务器的 ssl_context)、并发线程数无上限时的内存增长
    京ICP备2026067502号-1京公网安备11010502063487号