因此,我有一个任务列表,我想以非阻塞方式同时调度。
基本上,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 但是我如何发送等待列表而不是仅等待列表?
答案 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]阻止...
它仅阻止当前协程,与gather
或wait_for
相同。