Сообщить об ошибке.

Функция run() модуля asyncio в Python

Функция asyncio.run() запускает цикл событий в асинхронном коде

Синтаксис:

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.