Использование wait_for с таймаутами со списком задач - PullRequest
0 голосов
/ 05 октября 2019

Итак, у меня есть список задач, которые я хочу планировать одновременно без блокировки. В основном, 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 Ответ

1 голос
/ 05 октября 2019

Я хочу, чтобы любая задача, которая требует> времени ожидания, отменялась, и я продолжаю то, что у меня есть.

Этого просто достичь с помощью 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.

...