Как использовать возможности uvicorn и asgi в django?
Я реализовал крошечное приложение Django (v4.0.4), содержащее REST API - метод GET для получения некоторых данных. Далее я хотел запустить проект с помощью gunicorn+uvicorn, поскольку в одной статье я увидел более эталонную производительность, чем при обычном развертывании. Поэтому я решил получить свой собственный бенчмарк, используя инструмент wrk.
Вот что у меня есть:
| Command | Webserver | Protocol | Result (Req/Sec) |
|---|---|---|---|
python manage.py runserver 0.0.0.0:8000 |
Django Default | wsgi | 13.06 |
gunicorn bitpin.wsgi:application --bind 0.0.0.0:8000 -w 2 |
gunicorn | wsgi | 45.20 |
gunicorn bitpin.asgi:application --bind 0.0.0.0:8000 -w 2 -k uvicorn.workers.UvicornWorker |
uvicorn+gunicorn | asgi | 22.17 |
Однако, вышеприведенный результат демонстрирует нечто другое!
Причина в том, что когда я хочу использовать asgi, я должен использовать async метод вместо этого для моего представления API? Если да, то как я могу изменить представление Django REST API на async?
Или я мог упустить какие-то конфигурации?
[NOTE]:
Я запустил бенчмарк, используя следующую команду:
wrk -t4 -c11 -d20s -H "Authorization: Token xxx" http://127.0.0.1:8000/api/v1/content/Стоит отметить, что для этого теста я использовал два рабочих
gunicornи очевидно, что чем больше рабочих, тем лучше будет производительность.
İf you want create async rest api use one async main function and you can call another synchronous function from this function.
например:
#url.py:
path('Create',views.data_export,name='export_database')
#view.py
async def data_export(request):
if(request.method == 'POST'):
if(db_connect):
system_id=request.POST.get('system_id')
export_id =request.POST.get('export_id')
asyncio.create_task(start(system_id,export_id))
return HttpResponse("Starting")
async def start(system_id,export_id):
export_task = sync_to_async(start_export,thread_sensitive=False)
system_id=str(config['COLLECTION_NAME']+'_'+system_id)
await export_task(system_id,export_id)
export_task является синхронной функцией.
Вот как я сделал rest api асинхронным.