django - Django 3.x - 哪个 ASGI 服务器(Uvicorn vs. Daphne)
问题描述
我有一个用 Django 3 编写的简单的基于 API 的 Web 应用程序。在 Django 文档中有一个关于ASGI服务器的页面,并提到了两个选项:Daphne和Uvicorn。不幸的是,他们没有提供任何关于特定选择的好处的描述,所以在选择其中一个时我很困惑。
围绕两者编写 Django 应用程序有什么区别(如果有的话),是否有任何性能或稳定性问题需要注意?
基本上,使用 Uvicorn 代替 Daphne 有很大的不同吗?我的服务器在 Ubuntu 上运行,如果这很重要的话。
解决方案
简单回答: 既然你以前用过gunicorn,而且你很熟悉,那就用uvicorn,特别是因为它应该在生产中用作gunicorn worker。如果您没有这方面的经验,那么我建议您使用daphne。两者都将在一个简单的项目上完成工作,并且性能似乎是相等的。
解释:
ASGI是一项相当新的技术,与该语言中的大多数其他设计更改元素相比, python 的async/await也是如此。uvicorn 、daphne和hypercorn也都在积极开发中,因此这些库不可能有任何“公平”的基准测试。因此,在选择您想要的东西时,例如,当他们说时,您通常必须相信他们的话;他们的目标是快速、易于使用、轻巧或其他。
话虽如此,我仍然可以与 Uvicorn 和 Daphne 分享我的经验:
Daphne绝对是一个庞大的项目,它有很多依赖项,并不是每个项目都完全使用。他们肯定已经尽了最大努力涵盖了许多功能,并且由于他们也是 Django 团队的一员,因此您应该期望与 Django 有更好的长期兼容性。不过,Daphne 的入门可能会令人生畏。
Uvicorn是轻量级的,你甚至可以阅读整个库的代码,并了解其中的齿轮是如何转动的。由于我主要使用 Uvicorn,我知道它有一些缺失的功能和错误,而这些功能和错误预计会开箱即用,如果您想要从 ASGI 服务器获得自定义行为,篡改 Uvicorn 比其他方法更容易。关于 Uvicorn,我最喜欢的部分是它甚至不是流程管理器,而是被设计为 gunicorn 的生产工人。
旁注:与 Uvicorn 挂钩实际上并不是有意或容易的。这样做通常不是一个好习惯,但考虑到在寻找替代方案 18 小时后(我个人想捕获并处理 SIGTERM 以正常关闭,但正常方法不起作用,因为一切都在异步循环中),我找不到更好的方法。所以我会厚颜无耻地放一段代码,让你获得难以捉摸的“服务器”实例。从那里,小心地穿线。(没有双关语)
import inspect #Might not be future proof! Use with care
from uvicorn import Server as UvicornServer
server = next( server for frameinf in inspect.stack() if 'server' in frameinf[0].f_locals and isinstance(server:=frameinf[0].f_locals['server'], UvicornServer) )
另一个旁注: 如果您实际上选择使用 Uvicorn,并且您正在使用 django 和频道,您可能需要先删除“daphne”,因为它是频道的一个相当未使用的依赖项。
推荐阅读
- python - 我应该如何使循环/任务开始?
- javascript - 使用 lodash 在 javascript 中比较两个深度嵌套的数组
- c# - GeoCoordinateWatcher 的问题 - 一个应用程序的 GeoPositionPermission 被拒绝,但另一个应用程序被授予
- exception - IAR 编译器链接器错误 [Li009]:_CPP_Exceptions 必须被禁用,但模块的值为“已使用”
- python - 检查字典值字典中列表中的值是否并返回索引
- javascript - 如何通过休息电话获得承诺的价值
- amazon-web-services - CreateModel 操作:在 s3://my-bucket/testing/model/output/model.tar.gz 找不到模型数据
- visual-studio - 将 Visual Studio Test Runner 与自定义生成配置一起使用
- java - 用于文本块对齐的 IntelliJ Java 代码样式
- regex - REGEXP_SUBSTR Oracle 不同于 regext.com