bigywater.tech
Flask · 173

uWSGI 与 Flask

uWSGI 怎么部署 Flask?默认参数有哪些坑?线程、预加载、超时各是什么行为?这篇用真实的 uwsgi 把每个参数的效果验证出来,包括一个和文档不一致的结果。

--callable
不写时 uWSGI 找 application 变量,找不到就让每个请求 500
--lazy-apps
让每个 worker 各自加载应用,避免 fork 共享导入时的资源
线程
这个版本不加 --enable-threads 线程也运行,与文档说法不同

入口与 --callable

实测 · 本机执行输出
  --module app --callable app      → 200 {"pid":63208,"token":6563}
  --module app(不写 --callable)      → 500 Internal Server Error

上一篇:Gunicorn 启动 Flask;下一篇:Nginx 反向代理。

线程支持

实测 · 本机执行输出
  默认                 1 秒后 FLAG = {"thread_ran":true}
  --enable-threads   1 秒后 FLAG = {"thread_ran":true}

预加载与 --lazy-apps

实测 · 本机执行输出
  默认(master 加载后 fork)        看到 3 个 worker,TOKEN 有 1 个不同的值
  --lazy-apps                看到 3 个 worker,TOKEN 有 3 个不同的值

--harakiri

实测 · 本机执行输出
  慢请求 → RemoteDisconnected,用时 1515 ms;之后新请求 → 200(worker 被重新拉起)

吞吐

实测 · 本机执行输出
  uwsgi --http 4 进程 1753 请求/秒(失败 0)
  gunicorn sync 4 worker 3668 请求/秒(失败 0)

uwsgi 是装在自己虚拟环境里的版本;压测工具是 ApacheBench,与服务同机运行,每个数字只测一次。

分步演示

uWSGI 与 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,数字每次运行会有小幅抖动。uWSGI(虚拟环境里安装的版本)、gunicorn
    • 没有验证:--socket 加 nginx 的 uwsgi_pass 的生产用法与吞吐、uwsgi 的 emperor 模式、--processes 与 --threads 的组合、--max-requests、uWSGI 项目进入维护模式后的长期选型建议
    京ICP备2026067502号-1京公网安备11010502063487号