Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про Python: asyncio, gather, async, await, concurrency, Python

В чем особенность asyncio.gather относительно порядка результатов?

Вопрос проверяет понимание поведения asyncio.gather по сохранению порядка возвращаемых результатов, что важно для корректной обработки асинхронных операций.

Короткий ответ

Функция asyncio.gather запускает несколько корутин конкурентно и возвращает список их результатов. Ключевая особенность: порядок результатов в возвращаемом списке всегда соответствует порядку переданных корутин, независимо от того, в каком порядке они фактически завершились. Это гарантирует предсказуемость, но если одна из корутин завершится с ошибкой, поведение зависит от параметра return_exceptions.

Длинный ответ

Функция asyncio.gather — это высокоуровневая утилита для конкурентного выполнения нескольких асинхронных операций (корутин). Её основная задача — запустить переданные корутины и дождаться завершения всех из них, собрав результаты в единую структуру данных.

Порядок результатов

Несмотря на то, что корутины выполняются конкурентно и могут завершаться в произвольном порядке (например, из-за разной длительности операций ввода-вывода), asyncio.gather гарантирует, что порядок элементов в возвращаемом списке результатов будет точно соответствовать порядку, в котором корутины были переданы в функцию. Это поведение реализовано преднамеренно, чтобы упростить сопоставление результата с исходной задачей.

Пример кода

import asyncio

async def task(name, delay):
    await asyncio.sleep(delay)
    return f"Result from {name}"

async def main():
    # Запускаем три задачи с разной задержкой.
    # Задача 'C' завершится первой, 'A' — последней.
    results = await asyncio.gather(
        task('A', 3),
        task('B', 1),
        task('C', 0.5),
    )
    print(results)
    # Вывод: ['Result from A', 'Result from B', 'Result from C']
    # Порядок соответствует порядку передачи, а не времени завершения.

asyncio.run(main())

Обработка ошибок

Поведение при возникновении исключения в одной из корутин зависит от параметра return_exceptions. По умолчанию (return_exceptions=False) первое возникшее исключение немедленно пробрасывается, а остальные задачи отменяются. Если установить return_exceptions=True, исключения возвращаются как обычные результаты в списке, сохраняя порядок. Это позволяет обработать все результаты, включая неудачные.

Где применяется

asyncio.gather идеально подходит для сценариев, когда необходимо выполнить несколько независимых асинхронных операций (например, параллельные HTTP-запросы к разным API, чтение нескольких файлов, одновременные запросы к базам данных) и получить все результаты для дальнейшей обработки. Гарантия порядка упрощает последующее сопоставление данных.

Вывод: Используйте asyncio.gather, когда вам нужно конкурентно выполнить набор задач и получить их результаты в предсказуемом, соответствующем исходному порядку, виде, особенно если порядок результатов важен для логики вашего приложения.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Python

    Python

Ключевые слова

#asyncio

#gather

#async

#await

#concurrency

#Python

Подпишись на Python Developer в телеграм