使用带有超时的任务列表的wait_for

时间:2019-10-04 21:19:53

标签: python-asyncio python-3.7

因此,我有一个任务列表,我想以非阻塞方式同时调度。 基本上,gather应该可以解决问题。 像

tasks = [ asyncio.create_task(some_task()) in bleh]
results = await asyncio.gather(*tasks)

但是,我还需要超时。我想要的是任何需要>超时时间的任务都取消,然后我继续执行现有的操作。

我应该使用asyncio.wait原语。 https://docs.python.org/3/library/asyncio-task.html#waiting-primitives

但是随后文档说: Run awaitable objects in the aws set concurrently and block until the condition specified by return_when.

似乎暗示它会阻止...

似乎asyncio.wait_for可以解决问题 https://docs.python.org/3/library/asyncio-task.html#timeouts 但是我如何发送等待列表而不是仅等待列表?

1 个答案:

答案 0 :(得分:1)

  

我想要的是所有花费>超时时间的任务都取消,然后我继续执行现有的任务。

这很容易通过asyncio.wait()实现:

# Wait for tasks to finish, but no more than a second.
done, pending = await asyncio.wait(tasks, timeout=1)
# Cancel the ones not done by now.
for fut in pending:
    fut.cancel()
# Results are available as x.result() on futures in `done`
  

似乎建议[asyncio.wait]阻止...

它仅阻止当前协程,与gatherwait_for相同。