Метод
asyncio.run()
в Python является высокоуровневой функцией, предназначенной для простого запуска сопрограмм (coroutines) в асинхронном коде. Он выполняет несколько ключевых задач для обеспечения корректного и удобного исполнения асинхронных программ:
-
Создание и управление циклом событий (Event Loop):
asyncio.run()
автоматически создает новый цикл событий asyncio.get_event_loop()
если его нет, или получает текущий цикл, если он уже существует. Он служит основой для асинхронного выполнения, управляя задачами и их расписанием.
-
Запуск переданной сопрограммы: Метод принимает сопрограмму в качестве аргумента и планирует её выполнение в созданном цикле событий. Он оборачивает сопрограмму в
asyncio.Task
и использует метод loop.run_until_complete()
для запуска задачи, пока она не завершится.
-
Обработка исключений:
asyncio.run()
предназначен для обработки неперехваченных исключений, возникающих в сопрограмме. Он вызывает метод loop.shutdown_asyncgens()
, чтобы корректно завершить асинхронные генераторы, и перехватывает любые необработанные исключения, выводя их в stderr
. Это помогает предотвратить "тихие" ошибки и обеспечивает отладку.
-
Закрытие цикла событий: После завершения выполнения сопрограммы,
asyncio.run()
всегда закрывает цикл событий с помощью loop.close()
. Это освобождает ресурсы, связанные с циклом, и гарантирует, что программа завершится правильно, не оставляя "висячих" задач или соединений.
Важные моменты:
-
asyncio.run()
предназначен для использования только один раз на программу верхнего уровня (main). Не следует вызывать его из других сопрограмм или функций.
-
Он автоматически управляет контекстом выполнения асинхронного кода, избавляя разработчика от необходимости самостоятельно создавать и закрывать цикл событий.
-
Если цикл событий уже запущен (например, внутри фреймворка), вызов
asyncio.run()
приведет к ошибке. В таких случаях следует использовать более низкоуровневые API asyncio, такие как loop.create_task()
и loop.run_forever()
.
Вкратце,
asyncio.run()
является удобным инструментом для запуска асинхронных программ, обеспечивая управление циклом событий, обработку исключений и корректное завершение. Он упрощает написание асинхронного кода, особенно для начинающих.