bigywater.tech
Flask · 190

Flask 应用启动耗时

Flask 应用启动要多久?时间都花在哪?--preload、惰性导入、字节码缓存各自有多大作用?这篇用真实的 import 计时、-X importtime 和 gunicorn 的首个 200 响应时间逐项量出来(这是 Flask 系列的最后一篇,健康检查见第 179 篇,优雅关闭见第 180 篇)。

4.0×
没有 .pyc 缓存时同一组 import 的耗时倍数
108 → 266 ms
gunicorn 首个 200:轻应用 vs 重 import
151 ms
惰性导入后某个 worker 第一次请求的耗时

import 耗时

实测 · 本机执行输出
  解释器本身(pass)                                                                 19 ms
  import flask                                                               106 ms
  import flask + flask_sqlalchemy                                            222 ms
  重一些的一组(sqlalchemy、pydantic、marshmallow、cryptography、jwt、apispec)           283 ms

上一篇:容器信号处理。这是 Flask 系列的最后一篇。

计时在 macOS 上、Python 3.14 下完成,数字会随机器变化,比例更有参考价值。

字节码缓存

实测 · 本机执行输出
  有缓存(预热过):285 ms | 没有缓存、每次重新编译:1145 ms | 比值 4.0×

谁最贵

实测 · 本机执行输出
  flask_sqlalchemy            99.1 ms(累计)
  flask                       78.0 ms(累计)
  marshmallow                 18.0 ms(累计)
  jwt                         15.0 ms(累计)
  pydantic                    10.1 ms(累计)
  cryptography.fernet          6.8 ms(累计)

gunicorn 首个 200

实测 · 本机执行输出
配置                                    首个 200(ms)          之后 12 个请求中最慢(ms)
轻应用                                          108                       0.6
重 import                                     266                       0.7
重 import + --preload                         273                       0.7
重 import 放进视图(惰性)                            262                     150.5

加载慢与 --timeout

实测 · 本机执行输出
  --timeout 2  → 3124 ms 后第一个 200;日志里 Booting worker 1 次、WORKER TIMEOUT 0 次
  --timeout 30 → 3177 ms 后第一个 200;日志里 Booting worker 1 次、WORKER TIMEOUT 0 次

分步演示

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,数字每次运行会有小幅抖动。Python -X importtime、gunicorn(sync worker)
    • 没有验证:容器冷启动(镜像拉取、文件系统层)、Kubernetes 的 startupProbe、gevent/gthread worker 的加载阶段、import 以外的初始化(数据库连接、预热缓存)、更大的应用(数百个路由与蓝图)的启动曲线、Python 的 lazy import 新机制
    京ICP备2026067502号-1京公网安备11010502063487号