在Aiohttp应用中管理长期运行的任务

时间:2019-04-30 07:44:23

标签: python-asyncio aiohttp

我在Aiohttp中有一个Web应用程序。

如何管理长期运行的任务? 我看到了这种情况。这是好还是坏?

  1. 用户请求一些长期运行的任务。
  2. 服务器创建任务 new_task = asyncio.create_task() 为新任务生成uuid并将其全部保存在dict中:
new_task = asyncio.create_task()
uuid_task = uuid.uuid4()
tasks_set.update({
    uuid_task: new_task
})
  1. 将状态为202接受和任务的uuid发送给客户端答案。
  2. 一段时间后,用户使用任务uuid​​发出请求以询问任务的状态。
  3. 服务器在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)

但是我还必须管理任务超时(用户走了,我们应该停止他的任务)。有什么建议吗?

1 个答案:

答案 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来测试超时。