Для удобства asyncio поддерживает автоматическое создание цикла событий без необходимости проходить вызовы к new_event_loop()
и set_event_loop()
.Поскольку цикл обработки событий является относительно дорогостоящим и потребляет некоторые ресурсы ОС, он создается не при импорте, а по запросу, в частности при первом вызове get_event_loop()
.(Эта функция в основном устарела asyncio.run
, которая всегда создает новый цикл событий, а затем автоматически созданный цикл может вызвать проблем .)
Это удобствооднако зарезервирован для основного потока - любой другой поток должен явно установить цикл обработки событий.Для этого есть несколько возможных причин:
- предотвращение путаницы - вы не хотите, чтобы случайный вызов
get_event_loop()
из произвольного потока соответствовал «основному» (автоматически созданному) циклу событий дляэтот поток; - некоторые функции asyncio работают лучше всего, когда или требуют запуска цикла событий в главном потоке - например, подпроцессы и обработка сигналов .
Этих проблем также можно избежать, автоматически создавая новый цикл событий в каждом потоке, который вызывает get_event_loop()
, но это упростит случайное создание нескольких циклов событий, сопрограммы которых будутбыть не в состоянии общаться друг с другом, что противоречило бы дизайну asyncio.Таким образом, оставшаяся опция - это специальный код для основного потока, побуждающий разработчиков использовать этот поток для выполнения асинхронного кода.