【发布时间】:2022-01-23 03:58:20
【问题描述】:
从 3.1 版起,Django 支持异步视图。我有一个在 uvicorn 上运行的 Django 应用程序。我正在尝试编写一个异步视图,它可以同时处理对自身的多个请求,但没有成功。
我见过的常见示例包括从视图内部进行多个慢速 I/O 操作:
async def slow_io(n, result):
await asyncio.sleep(n)
return result
async def my_view(request, *args, **kwargs):
task_1 = asyncio.create_task(slow_io(3, 'Hello'))
task_2 = asyncio.create_task(slow_io(5, 'World'))
result = await task_1 + await task_2
return HttpResponse(result)
这将在 5 秒而不是 8 秒后为我们生成“HelloWorld”,因为请求是同时运行的。
我想要的是同时处理对 my_view 的多个请求。例如。我希望这段代码能在 5 秒内同时处理 2 个请求,但需要 10 秒。
async def slow_io(n, result):
await asyncio.sleep(n)
return result
async def my_view(request, *args, **kwargs):
result = await slow_io(5, 'result')
return HttpResponse(result)
我用这个命令运行 uvicorn:
uvicorn --host 0.0.0.0 --port 8000 main.asgi:application --reload
Django doc 说:
主要好处是能够在不使用 Python 线程的情况下为数百个连接提供服务。
所以有可能。
我错过了什么?
更新: 看来,我的测试设置是错误的。我在浏览器中打开多个标签并一次刷新它们。详情请见我的answer。
【问题讨论】:
-
如何发送请求?
-
@lucutzu33 我在浏览器中打开多个选项卡并一次全部刷新。这并不精确,但大超时(5、10 秒)足以看出选项卡加载之间的延迟比刷新它们所需的时间长得多。我还添加了时间戳记录,它显示请求之间的准确时间为 5 秒。
标签: django async-await