Asyncio.create_task() не выполняется асинхронно в функции асинхронного представления
Я создаю асинхронную функцию для загрузки видео. Цель состоит в том, чтобы запустить загрузку видео асинхронно в фоновом режиме, не заставляя пользователя ждать. Пока видео загружается, пользователь будет перенаправлен на другую страницу.
Следуя инструкциям в документации Python по asyncio, я использую create_task()
, поскольку это кажется самым простым решением.
В следующем коде он работает, но не выполняется асинхронно. HttpResponseRedirect
не выполняется до тех пор, пока видео не будет полностью загружено.
Я также вставил 2 строки, чтобы проверить, выполняется ли upload_video()
асинхронно, и это так. print('before')
и print('after')
выводятся на консоль до того, как завершается функция upload_video
. Однако заключительная HttpResponseRedirect()
не выполняется до тех пор, пока не будет выполнен весь код.
async def my_async_func(request):
if request.method == 'POST':
video = request.FILES['video']
print('before')
asyncio.create_task(upload_video(video))
print('after')
return HttpResponseRedirect(... somewhere)
async def upload_video(video):
...
По сути, несмотря на весь асинхронный синтаксис и логику, которую я написал, функция все равно работает как типичная синхронная функция представления django.
Почему так происходит? Что нужно изменить, чтобы upload_video()
выполнялось асинхронно и возвращало HttpResponseRedirect()
без ожидания?
P.S. Я также попробовал заменить create_task()
на ensure_future()
, но это дало тот же результат - видео загружается, но не асинхронно.
Используйте цикл событий Django вместо стандартного:
tasks = set()
async def my_async_func(request):
loop = asyncio.get_running_loop()
if request.method == 'POST':
video = request.FILES['video']
print('before')
task = loop.create_task(upload_video(video)
tasks.add(task)
tasks.add_done_callback(tasks.discard)
print('after')
return HttpResponseRedirect(... somewhere)
async def upload_video(video):
...
Кроме того, убедитесь, что вы сохранили ссылку на задачу, чтобы она не исчезла.