Документация Python неофициальный перевод
Содержание страницы

18.5.2. Циклы событийEvent loops

18.5.2.1. Функции цикла событийEvent loop functions

Следующие функции – удобные сокращения для доступа к методам глобальной политики. Обратите внимание: они предоставляют доступ к политике по умолчанию, если только в процессе выполнения программы ранее не была установлена другая политика вызовом set_event_loop_policy().

asyncio.get_event_loop()

Эквивалентно вызову get_event_loop_policy().get_event_loop().

asyncio.set_event_loop(loop)

Эквивалентно вызову get_event_loop_policy().set_event_loop(loop).

asyncio.new_event_loop()

Эквивалентно вызову get_event_loop_policy().new_event_loop().

18.5.2.2. Доступные циклы событийAvailable event loops

asyncio в настоящее время предоставляет две реализации циклов событий: SelectorEventLoop и ProactorEventLoop.

class asyncio.SelectorEventLoop

Цикл событий на основе модуля selectors. Подкласс BaseEventLoop.

Использует самый эффективный селектор, доступный на платформе.

В Windows поддерживаются только сокеты (например, каналы не поддерживаются): см. документацию MSDN по select.

class asyncio.ProactorEventLoop

Proactor-цикл событий для Windows, использующий «I/O Completion Ports» (также известные как IOCP). Подкласс BaseEventLoop.

Доступность: Windows.

Пример использования ProactorEventLoop в Windows:

import asyncio, sys

if sys.platform == 'win32':
    loop = asyncio.ProactorEventLoop()
    asyncio.set_event_loop(loop)

18.5.2.3. Поддержка платформPlatform support

Модуль asyncio спроектирован переносимым, но каждая платформа всё ещё имеет незначительные различия и может не поддерживать все возможности asyncio.

18.5.2.3.1. Windows

Общие ограничения циклов событий Windows:

Ограничения, характерные для SelectorEventLoop:

Ограничения, характерные для ProactorEventLoop:

Разрешение монотонных часов в Windows обычно составляет около 15,6 мс. Наилучшее разрешение – 0,5 мс. Разрешение зависит от оборудования (наличие HPET) и от конфигурации Windows. См. отложенные вызовы asyncio.

18.5.2.3.2. Mac OS X

Символьные устройства, такие как PTY, хорошо поддерживаются только начиная с Mavericks (Mac OS 10.9). Они вообще не поддерживаются на Mac OS 10.5 и старше.

В Mac OS 10.6, 10.7 и 10.8 циклом событий по умолчанию является SelectorEventLoop, который использует selectors.KqueueSelector. selectors.KqueueSelector не поддерживает символьные устройства в этих версиях. SelectorEventLoop можно использовать с SelectSelector или PollSelector для поддержки символьных устройств в этих версиях Mac OS X. Пример:

import asyncio
import selectors

selector = selectors.SelectSelector()
loop = asyncio.SelectorEventLoop(selector)
asyncio.set_event_loop(loop)

18.5.2.4. Политики цикла событий и политика по умолчаниюEvent loop policies and the default policy

Управление циклом событий абстрагируется с помощью шаблона политики, чтобы обеспечить максимальную гибкость для нестандартных платформ и фреймворков. На протяжении выполнения процесса один глобальный объект политики управляет циклами событий, доступными процессу, в зависимости от контекста вызова. Политика – это объект, реализующий интерфейс AbstractEventLoopPolicy.

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

Политика по умолчанию определяет контекст как текущий поток и управляет циклом событий для каждого потока, который взаимодействует с asyncio. Функции уровня модуля get_event_loop() и set_event_loop() предоставляют удобный доступ к циклам событий, управляемым политикой по умолчанию.

18.5.2.5. Интерфейс политики цикла событийEvent loop policy interface

Политика цикла событий должна реализовывать следующий интерфейс:

class asyncio.AbstractEventLoopPolicy

Политика цикла событий.

get_event_loop()

Возвращает цикл событий для текущего контекста.

Возвращает объект цикла событий, реализующий интерфейс BaseEventLoop.

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

set_event_loop(loop)

Устанавливает цикл событий для текущего контекста равным loop.

new_event_loop()

Создаёт и возвращает новый объект цикла событий в соответствии с правилами этой политики.

Если необходимо установить этот цикл в качестве цикла событий для текущего контекста, set_event_loop() должен быть вызван явно.

18.5.2.6. Доступ к глобальной политике циклаAccess to the global loop policy

asyncio.get_event_loop_policy()

Возвращает текущую политику цикла событий.

asyncio.set_event_loop_policy(policy)

Устанавливает текущую политику цикла событий. Если policy равно None, восстанавливается политика по умолчанию.