Python 3.4+Асинхронное программированиефункция
asyncio.wait()
параллельность
Ждёт набор задач и возвращает два множества — готовые и ещё ждущие; условие остановки задаёт return_when.
Синтаксис
done, pending = await asyncio.wait(aws, *, timeout=None, return_when=ALL_COMPLETED)
В отличие от gather и wait_for, wait() ничего не бросает и ничего не отменяет: исключения остаются внутри задач (их достают task.result() или task.exception()), а задачи из pending продолжают работать и после тайм-аута. С 3.11 передать голые корутины нельзя — TypeError; нужны задачи из create_task. FIRST_COMPLETED удобен для «кто первый», FIRST_EXCEPTION — чтобы остановиться на первой ошибке.
Примеры
import asyncio
async def main():
fast = asyncio.create_task(asyncio.sleep(0.01, result='быстрый'))
slow = asyncio.create_task(asyncio.sleep(1, result='медленный'))
done, pending = await asyncio.wait({fast, slow}, return_when=asyncio.FIRST_COMPLETED)
print([t.result() for t in done], len(pending)) # → ['быстрый'] 1
for t in pending:
t.cancel() # сам wait ничего не отменяет
asyncio.run(main())
# Python 3.11+
import asyncio
async def main():
coro = asyncio.sleep(0.01)
try:
await asyncio.wait([coro])
except TypeError:
print('нужны задачи, а не корутины') # → нужны задачи, а не корутины
finally:
coro.close()
asyncio.run(main())
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности