Содержание страницы
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:
- create_unix_connection() и create_unix_server() не поддерживаются: семейство сокетов socket.AF_UNIX характерно для UNIX
- add_signal_handler() и remove_signal_handler() не поддерживаются
- EventLoopPolicy.set_child_watcher() не поддерживается. ProactorEventLoop поддерживает подпроцессы. У него есть только одна реализация для отслеживания дочерних процессов, настраивать её не нужно.
Ограничения, характерные для SelectorEventLoop:
- SelectSelector is used which only supports sockets and is limited to 512 sockets.
- add_reader() and add_writer() only accept file descriptors of sockets
- Каналы не поддерживаются (например: connect_read_pipe(), connect_write_pipe())
- Подпроцессы не поддерживаются (например: subprocess_exec(), subprocess_shell())
Ограничения, характерные для ProactorEventLoop:
- SSL не поддерживается: create_connection() и create_server() нельзя использовать с SSL, например
- create_datagram_endpoint() (UDP) не поддерживается
- add_reader() и add_writer() не поддерживаются
Разрешение монотонных часов в 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, восстанавливается политика по умолчанию.