#python #django #asynchronous
#python #django #асинхронный
Вопрос:
Я запускаю Django-3.1 (а также я пробовал версию master 3.2) в режиме asgi через uvicorn. Но когда я открываю URL-адрес на нескольких вкладках браузера, я вижу запросы, которые должны обрабатываться последовательно. Похоже, что это утверждение из документов:
На сервере WSGI асинхронные представления будут выполняться в своем собственном цикле одноразовых событий.
также применяется к режиму ASGI.
Вот код, который я использую:
# asgi.py
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
application = get_asgi_application()
# settings.py
SECRET_KEY = "foo"
ROOT_URLCONF = "urls"
# urls.py
import asyncio
import uuid
from django.http import HttpResponse
from django.urls import path
async def view(request):
id = uuid.uuid4()
print(f"{id} sleeping")
await asyncio.sleep(5)
print(f"{id} woke up")
return HttpResponse("ok")
urlpatterns = [
path("", view),
]
И вот последовательный вывод, который я вижу:
$ uvicorn asgi:application
INFO: Started server process [28020]
INFO: Waiting for application startup.
INFO: ASGI 'lifespan' protocol appears unsupported.
INFO: Application startup complete.
INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL C to quit)
bb1d30bc-b05e-4412-94ad-f4507c766074 sleeping
bb1d30bc-b05e-4412-94ad-f4507c766074 woke up
INFO: 127.0.0.1:51878 - "GET / HTTP/1.1" 200 OK
f451d614-89dd-401d-8302-13e842040a3a sleeping
f451d614-89dd-401d-8302-13e842040a3a woke up
INFO: 127.0.0.1:51878 - "GET / HTTP/1.1" 200 OK
Ответ №1:
Да, это моя вина. Вероятно, это как-то связано с кэшированием chrome. Достаточно отключить его в dev-tool или отправлять параллельные запросы с помощью curl, чтобы убедиться, что он работает правильно.
seq 1 5 | xargs -n1 -P5 curl http://localhost:8000/