bigywater.tech
Django · 131

Uvicorn、Daphne 与 Django ASGI

Django 的 ASGI 应用可以交给 uvicorn、daphne,或者 gunicorn 配 UvicornWorker。它们在并发、启动、多进程和优雅停止上有什么差别?这篇把三者各起一个真实进程,用同一个应用逐项对比。

515 ms
三种 ASGI 部署方式处理 20 个并发请求,几乎一样
lifespan
Django 不支持,uvicorn 日志提示后正常启动
SIGTERM
uvicorn 等在途请求完成;daphne 直接断开(本测法)

并发与启动

实测 · 本机执行输出
  uvicorn                    async 视图    515 ms   sync 视图    521 ms   启动到能响应   519 ms   全部 200: True
  daphne                     async 视图    516 ms   sync 视图    524 ms   启动到能响应  2272 ms   全部 200: True
  gunicorn + UvicornWorker   async 视图    512 ms   sync 视图    523 ms   启动到能响应   523 ms   全部 200: True

并发能力来自 ASGI 与 Django 的线程分配(第 112、113 篇),与用哪个服务器关系不大。

lifespan 提示

实测 · 本机执行输出
   INFO:     Started server process [87233]
   INFO:     ASGI 'lifespan' protocol appears unsupported.
   INFO:     Application startup complete.

多个 worker

实测 · 本机执行输出
  总耗时 318 ms;各 worker 进程处理的请求数: [20, 20] (共 2 个进程)

uvicorn 自带的多进程模式由它自己管理 worker;需要更完整的进程管理(重启、信号)时,常见做法是 gunicorn 加 UvicornWorker,这里只验证了它能跑通并行,没有比较两者的进程管理能力。

优雅停止

实测 · 本机执行输出
  uvicorn    在途请求结果 200   SIGTERM 后进程退出用时 1527 ms
  daphne     在途请求结果 RemoteDisconnected   SIGTERM 后进程退出用时 123 ms

daphne 的结果是它的默认启动参数下的现象,是否有选项可以让它等在途请求,我没有查。

分步演示

ASGI 服务器
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 / Python 3.14.7 / Django 6.1.1(默认用 SQLite,其它数据库会在文中注明),用 django.test.Client 或真实的本机服务器进程实测;计时用 time.perf_counter,数字每次运行会有小幅抖动。uvicorn 0.54.0、daphne 4.2.3、uvicorn-worker 0.4.0、gunicorn 26.2.0;视图里 sleep 模拟等待;各配置只测一次
    • 没有验证:WebSocket / Channels、HTTP/2、长时间运行的内存、TLS 终止在 uvicorn / daphne 上、hypercorn 与 granian、更多 worker 时的启动时间
    京ICP备2026067502号-1京公网安备11010502063487号