异步视图
阅读: 931
评论:2
纵观Django的发展史和版本提升过程。1.x时代持续了多年,直到1.11结束,其实也就是3年前的事。
再往后,Django的版本号就像开了挂似的,短短3年间大版本号进入了3.x时代。
但其实对普通开发人员而言,你能感觉到的变化,就是2.0后使用path代替正则来编写url,这也是从1.x迁移到2.x甚至3.x时,唯一需要重点关注的事情。
至于3.0,嗯嗯,引入了ASGI,但无法原生支持Websocket,只是给大家打点鸡血。
而3.1,支持异步视图,但不支持异步ORM,其实也没什么太多感觉。
异步视图
在Django中,可以通过async def语法,将任何函数视图定义为异步视图。
对于类视图,则是将它的__call__()方法定义为async def,成为异步视图。
Web服务器可分为WSGI和ASGI两种模式,在不同的模式下,同步和异步视图有性能差别:
WSGI+同步视图:传统模式
ASGI+异步视图:性能最佳的异步模式
WSGI+同步视图+异步视图:传统模式混杂异步,异步视图的性能不能正常发挥
ASGI+同步视图+异步视图:异步模式混杂传统视图,异步性能最佳
WSGI 服务器下,异步视图将在其自有的一次性事件循环中运行。这意味着你可以放心使用异步特性(例如并发异步 HTTP 请求),但是你不会获得异步堆栈的好处。
ASGI的主要优点则是无需使用 Python 线程就能服务数百个连接。这就允许你使用慢流(slow streaming)、长轮询和其他响应类型。
(附ASGI官方文档地址:https://asgi.readthedocs.io/en/latest/extensions.html)
说明:
如果你的站点中没有同步的中间件,那么你将得到完全的异步请求栈的好处。如果有一个同步中间件,那么Django必须在每个请求中使用一个线程来安全地为它模拟一个同步环境。
中间件可以同时支持同步和异步上下文。Django的一些内置中间件就是这么构建的,但不是所有都这样。换句话说,就是目前你还无法原生得到完全的异步请求栈的性能。
由于ORM对数据库的访问这块依然没有实现异步处理,还是同步的。所以在一个异步视图中,你需要使用Django给你的sync_to_async() 方法将ORM操作包裹起来。例如:
from asgiref.sync import sync_to_async
results = await sync_to_async(Blog.objec