Django 的 ASGI 应用可以交给 uvicorn、daphne,或者 gunicorn 配 UvicornWorker。它们在并发、启动、多进程和优雅停止上有什么差别?这篇把三者各起一个真实进程,用同一个应用逐项对比。
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 篇),与用哪个服务器关系不大。
INFO: Started server process [87233] INFO: ASGI 'lifespan' protocol appears unsupported. INFO: Application startup complete.
总耗时 318 ms;各 worker 进程处理的请求数: [20, 20] (共 2 个进程)
uvicorn 自带的多进程模式由它自己管理 worker;需要更完整的进程管理(重启、信号)时,常见做法是 gunicorn 加 UvicornWorker,这里只验证了它能跑通并行,没有比较两者的进程管理能力。
uvicorn 在途请求结果 200 SIGTERM 后进程退出用时 1527 ms daphne 在途请求结果 RemoteDisconnected SIGTERM 后进程退出用时 123 ms
daphne 的结果是它的默认启动参数下的现象,是否有选项可以让它等在途请求,我没有查。