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

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

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

Следующие функции представляют собой удобные сокращения для доступа к методам gлобальной политики. Обратите внимание, что это обеспечивает доступ к политике по умолчанию, если только альтернативная политика не была установлена вызовом 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. Подкласс AbstractEventLoop.

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

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

class asyncio.ProactorEventLoop

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

Доступность: 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.

Изменено в версии 3.5: ProactorEventLoop теперь поддерживает SSL.

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()

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

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

Вызывает исключение, если для текущего контекста не задан цикл событий и текущая политика не предписывает его создать. Он никогда не должен возвращать 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)

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