У меня есть веб-приложение в Aiohttp.
Как управлять долгосрочными задачами?
Я вижу этот сценарий. Это плохо или хорошо?
- Пользователь делает запрос для некоторых длительных задач.
- Задача создания сервера с
new_task = asyncio.create_task()
Сгенерируйте uuid для нового задания и сохраните все в dict:
new_task = asyncio.create_task()
uuid_task = uuid.uuid4()
tasks_set.update({
uuid_task: new_task
})
- Отправить ответ клиенту со статусом 202 Принят и UUID задачи.
- Через некоторое время пользователь делает запрос с заданием uuid для запроса статуса задания.
- Сервер ищет в
tasks_set
задание и получает его статус:
task = tasks_set.get(uuid_from_client)
if not task:
raise TaskNotFound # send error, 404 for example
if not task.done():
# task is not done yet
answer_to_client('task is not done')
return
else:
answer_to_client('task is done. Result: ', task.result())
tasks_set.pop(uuid_from_client)
Но я также должен управлять таймаутом для задач (пользователь ушел, и мы должны остановить его задачу). Любое предложение?