Django 3.x-哪个ASGI服务器(Uvicorn vs.Daphne)



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

围绕这两者编写Django应用程序有什么区别(如果有的话(?是否存在需要注意的性能或稳定性问题?

基本上,使用乌维科恩而不是达芙妮有很大区别吗?我的服务器运行在Ubuntu上,如果这很重要的话。

简单答案:由于您以前使用过gunicorn,并且对它很熟悉,请使用uvicon,特别是因为它应该在生产中用作gunicorns工人。如果你没有使用它的经验,那么我建议daphne。两人都将在一个简单的项目上完成这项工作,而且表现似乎相当。


解释:

ASGI是一项相当新的技术,与该语言中大多数其他改变设计的元素相比,python的async/await也是如此。uvicondaphne

hypercorn话虽如此,我仍然可以与乌维科恩和达芙妮分享我的经历:

Daphne绝对是一个更庞大的项目,它有很多依赖项,但并不是每个项目都完全使用这些依赖项。他们确实已经尽了最大努力覆盖了许多功能,而且由于他们也是Django团队的一部分,所以你应该期待与Django有更好的长期兼容性。不过,与达芙妮开始交往可能会让人感到害怕。

Uvicorn是轻量级的,您甚至可以阅读整个库的代码,并了解齿轮是如何在内部转动的。由于我主要使用过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";首先,因为它是一个相当未使用的通道依赖项。

最新更新