【问题标题】:Django 3.x - which ASGI server (Uvicorn vs. Daphne)Django 3.x - 哪个 ASGI 服务器(Uvicorn vs. Daphne)
【发布时间】:2020-05-09 17:26:06
【问题描述】:

我有一个用 Django 3 编写的简单的基于 API 的 Web 应用程序。在 Django 文档中有一个关于 ASGI 服务器的 page,并提到了两个选项:DaphneUvicorn。不幸的是,他们没有提供任何关于特定选择的好处的描述,所以在选择其中一个时我很困惑。

围绕两者编写 Django 应用程序有什么不同(如果有的话),是否需要注意任何性能或稳定性问题?

基本上,使用 Uvicorn 代替 Daphne 有很大的不同吗?我的服务器在 Ubuntu 上运行,如果这很重要的话。

【问题讨论】:

  • 为什么要使用 ASGI 服务器?你在任何地方都使用异步代码吗?
  • @TomCarrick 我想在某些部分开始使用,主要是尝试通过数据处理来加速一些操作。我还认为,当我将 gunicorn 换成其他东西时,这可能会影响整体服务器性能
  • Django Channels 提供了一个在 Django 中使用异步的框架。我有一些长期运行的工作,我想把 websockets 放在前面。一种模式是有一个单独的异步套接字服务器将消息放入代理,然后 Django 服务订阅它。频道是 Uvicorn vs Daphne 的一个原因。对于常规 Django 应用程序的异步协程性能,gunicorn can run workers in greenlets 通过利用 eventlet 或 gevent 而不是线程。
  • Hypercorn 现在也被提及了。

标签: django daphne asgi uvicorn


【解决方案1】:

简单回答: 由于您以前使用过 gunicorn 并且您熟悉它,请使用 uvicorn,特别是因为它应该用作 gunicorn worker in production。 如果你没有这方面的经验,那么我会建议 daphne。 两者都将在一个简单的项目中完成工作,并且性能似乎相同。


说明:

ASGI 是一项相当新的技术,python 的 async/await 与该语言中的大多数其他设计更改元素相比也是如此。 uvicorndaphnehypercorn 也都在积极开发中,因此不能对这些库进行任何“公平”的基准测试。因此,在选择您想要的东西时,例如,当他们说时,您通常必须相信他们的话;他们的目标是快速、易于使用、轻巧或其他。

话虽如此,我仍然可以与 Uvicorn 和 Daphne 分享我的经验:

Daphne 绝对是一个比较庞大的项目,它有很多依赖项,并不是每个项目都完全使用。他们肯定已经尽了最大努力涵盖了许多功能,并且由于他们也是 Django 团队的一员,因此您应该期望与 Django 有更好的长期兼容性。不过,Daphne 的入门可能会令人生畏。

Uvicorn 是轻量级的,你甚至可以阅读整个库的代码并了解其中的齿轮是如何转动的。由于我主要使用 Uvicorn,我知道它有一些缺失的功能和错误,而 expected to work out of the box,如果你想从你的 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”,因为它是频道的rather unused dependency

【讨论】:

  • 好吧,我需要说我正在努力使开发环境和登台/生产尽可能相似。所以我也在开发中使用达芙妮。到目前为止没有问题......但它不支持自动重载和it will never be implemented。 hypercorn 和 uvicorn 都可以。
  • 好的,我还要补充一点,hypercorn 支持 HTTP2,uvicorn 目前不支持(2021 年 4 月)。
猜你喜欢
  • 2020-10-14
  • 2021-08-21
  • 1970-01-01
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2021-11-02
  • 2020-01-08
  • 1970-01-01
相关资源
最近更新 更多