我在Aiohttp中有一个Web应用程序。
如何管理长期运行的任务? 我看到了这种情况。这是好还是坏?
new_task = asyncio.create_task()
为新任务生成uuid并将其全部保存在dict中:new_task = asyncio.create_task()
uuid_task = uuid.uuid4()
tasks_set.update({
uuid_task: new_task
})
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)
但是我还必须管理任务超时(用户走了,我们应该停止他的任务)。有什么建议吗?
答案 0 :(得分:1)
但是我还必须管理任务的超时时间
您可以使用asyncio.wait_for
向任何协程添加超时。代替:
# run coroutine in a new task
new_task = asyncio.create_task(coroutine(...))
您可以使用:
# run coroutine in a new task, for no longer than 10s
new_task = asyncio.create_task(asyncio.wait_for(coroutine(...), 10)
new_task.done()
在协程完成和超时时均成立。您可以通过测试new_task.done() and new_task.exception() is asyncio.TimeoutError
来测试超时。