Python Glossary English

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Сообщить о неточности