Python 3.4+Асинхронное программированиефункция
asyncio.as_completed()
параллельность
Отдаёт результаты набора awaitable-объектов по мере их готовности, а не в порядке передачи; можно задать общий тайм-аут.
Синтаксис
for coro in asyncio.as_completed(aws, *, timeout=None): result = await coro
До 3.13 это обычный итератор, и он отдаёт не исходные задачи, а новые корутины: for c in as_completed(aws): r = await c — так что сопоставить результат с задачей можно только по самому результату. С 3.13 работает и async for, который отдаёт исходные задачи. timeout общий на весь цикл: по его истечении очередное ожидание бросает TimeoutError, а незавершённые задачи не отменяются — их надо отменить самим.
Примеры
import asyncio
async def fetch(name, delay):
await asyncio.sleep(delay)
return name
async def main():
aws = [fetch('медленный', 0.03), fetch('быстрый', 0.01)]
for coro in asyncio.as_completed(aws):
print(await coro) # → быстрый / медленный
asyncio.run(main())
# Python 3.13+
import asyncio
async def fetch(delay):
await asyncio.sleep(delay)
return delay
async def main():
tasks = [asyncio.create_task(fetch(d)) for d in (0.02, 0.01)]
async for task in asyncio.as_completed(tasks):
print(task is tasks[1], task.result()) # → True 0.01 / False 0.02
asyncio.run(main())
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности