Циклы обработки событий
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.
Пример использования 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