Вы можете сгенерировать простые монотонно увеличивающиеся числовые идентификаторы и иметь глобальный запрос, который отображает идентификатор на экземпляр задачи. Отображение будет удалено после завершения сопрограммы. Например (не проверено):
import asyncio, itertools
_next_id = itertools.count().__next__
_tasks = {}
def make_task(corofn, *coroargs):
task_id = _next_id()
async def wrapped_coro():
try:
return await corofn(*coroargs)
finally:
del _tasks[task_id]
task = asyncio.create_task(wrapped_coro())
_tasks[task_id] = task
return task_id, task
def get_task(task_id):
return _tasks[task_id]
Вы можете использовать его в start_task
и stop_task
:
def start_task(request):
task_id, _ = make_task(coro)
response = {'task_id': task_id}
return web.json_response(json.dumps(response))
def stop_task(request):
task_id = json.loads(await request.text())['task_id']
task = get_task(task_id)
task.cancel()
response = {}
return web.json_response(json.dumps(response))