Spec-Zone.ru › Python 3.5

Циклы обработки событий

1. Функции цикла обработки событий

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

2. Доступные циклы обработки событий

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

class asyncio.SelectorEventLoop

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

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

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

class asyncio.ProactorEventLoop

Цикл обработки событий Proactor для Windows, использующий «порты завершения ввода/вывода» (IOCP). Подкласс AbstractEventLoop.

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

См. также

Документацию MSDN по портам завершения ввода/вывода.

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

import asyncio, sys

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

3. Поддержка платформ

Модуль asyncio разработан для портативности, но на каждой платформе все же есть небольшие различия, и не все функции asyncio могут быть доступны.

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 используется, что поддерживает только сокеты и ограничен 512 сокетами.
  • add_reader() и add_writer() принимают только дескрипторы файлов сокетов
  • Каналы не поддерживаются (например, connect_read_pipe(), connect_write_pipe())
  • Подпроцессы не поддерживаются (например, subprocess_exec(), subprocess_shell())

Ограничения для ProactorEventLoop:

  • create_datagram_endpoint() (UDP) не поддерживается
  • add_reader() и add_writer() не поддерживаются

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

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

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)

4. Политики циклов обработки событий и политика по умолчанию

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

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

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

5. Интерфейс политики цикла обработки событий

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

class asyncio.AbstractEventLoopPolicy

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

get_event_loop()

Получить цикл событий для текущего контекста.

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

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

set_event_loop(loop)

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

new_event_loop()

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

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

6. Доступ к глобальной политике цикла событий

asyncio.get_event_loop_policy()

Получить текущую политику цикла событий.

asyncio.set_event_loop_policy(policy)

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

© 2001–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.5/library/asyncio-eventloops.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API