import asyncio asyncio.run(coro, *, debug=None, loop_factory=None)
coro
- точка входа в асинхронную программу,debug=False
- включение отладчика,loop_factory=None
- используется для переопределения создания цикла событий (добавлен в в Python 3.12).Функция run()
модуля asyncio
выполнит сопрограмму coro
и вернет результат ее работы.
Функция asyncio.run()
создает новый цикл событий, запускает переданную сопрограмму coro
и в конце закрывает цикл событий. Если в программе используются асинхронные генераторы или пул потоков, то функция завершит их работу.
Функция asyncio.run()
не может быть вызвана, когда другой цикл событий asyncio
выполняется в том же потоке.
Если аргумент debug=True
, то цикл событий будет выполняться в режиме отладки. Значение False
явно отключает режим отладки. None
используется для соблюдения глобальных настроек режима отладки.
Изменено в Python 3.12: добавлен аргумент
loop_factory
.
Если аргумент loop_factory
не равен None
, то он используется для создания нового цикла событий, в противном случае используется asyncio.new_event_loop()
. В обязанности loop_factory
входит установка созданного цикла в качестве текущего. Рекомендуется использовать loop_factory
для настройки цикла обработки событий вместо использования политик.
Функция asyncio.run()
всегда создает новый цикл событий и в конце его закрывает. Её следует использовать в качестве основной точки входа для программ с использованием модуля asyncio
, а в идеале функцию asyncio.run()
следует вызывать только один раз.
Новое в Python 3.7
Изменено в Python 3.9: обновлено для использования
loop.shutdown_default_executor()
.Изменено в Python 3.10: по умолчанию для аргумента
debug
установлено значениеNone
, чтобы учитывать глобальные настройки режима отладки.Обратите внимание, что в Python 3.11 добавлен менеджер контекста
asyncio.Runner()
, упрощающий вызовы нескольких асинхронных функций в одном контексте.
В примере, сопрограмма loop.getnameinfo()
(асинхронный вариант функции socket.getnameinfo()
) конвертирует IP-адрес в имя хоста и номер порта в имя протокола, где это возможно.
import asyncio async def get_name(): TARGETS = [ ('8.8.8.8', 443), ('1.1.1.1', 443), ('8.8.4.4', 443), ('77.88.8.8', 443), ('77.88.8.88', 443), ('77.88.8.7', 443) ] # получаем текущий цикл событий loop = asyncio.get_event_loop() for target in TARGETS: # запускаем асинхронный вариант # функции socket.getnameinfo() host, port = await loop.getnameinfo(target) # выводим результаты print(f'{target[0]:15}: {host}') if __name__ == '__main__': asyncio.run(get_name()) # 8.8.8.8 : dns.google # 1.1.1.1 : one.one.one.one # 8.8.4.4 : dns.google # 77.88.8.8 : dns.yandex.ru # 77.88.8.88 : safe.dns.yandex.ru # 77.88.8.7 : family.dns.yandex.ru
Исходный код функции asyncio.run()
можно найти в /python/lib/asyncio/runners.py
.