asyncio-eventloops.md
1> **Источник:** https://python-all.ru/3.5/library/asyncio-eventloops.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 18.5.2. Циклы событий89## 18.5.2.1. Функции цикла событий1011Следующие функции представляют собой удобные сокращения для доступа к методам gлобальной политики. Обратите внимание, что это обеспечивает доступ к политике по умолчанию, если только альтернативная политика не была установлена вызовом [`set_event_loop_policy()`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.set_event_loop_policy) ранее в процессе выполнения программы.1213#### `asyncio.get_event_loop()`1415Эквивалентно вызову `get_event_loop_policy().get_event_loop()`.1617#### `asyncio.set_event_loop(loop)`1819Эквивалентно вызову `get_event_loop_policy().set_event_loop(loop)`.2021#### `asyncio.new_event_loop()`2223Эквивалентно вызову `get_event_loop_policy().new_event_loop()`.2425## 18.5.2.2. Доступные циклы событий2627asyncio в настоящее время предоставляет две реализации циклов событий: [`SelectorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.SelectorEventLoop) и [`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.ProactorEventLoop).2829#### `class asyncio.SelectorEventLoop`3031Цикл событий, основанный на модуле [`selectors`](https://python-all.ru/3.5/library/selectors.html#module-selectors). Подкласс [`AbstractEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop).3233Использует самый эффективный селектор, доступный на платформе.3435В Windows поддерживаются только сокеты (например, каналы не поддерживаются): см. [документацию MSDN по select](https://python-all.ru/3.5/library/asyncio-eventloops.html).3637#### `class asyncio.ProactorEventLoop`3839Proactor-цикл событий для Windows, использующий «I/O Completion Ports» (также известные как IOCP). Подкласс [`AbstractEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop).4041Доступность: Windows.4243> **См. также**44>45> [документация MSDN по портам завершения ввода-вывода](https://python-all.ru/3.5/library/asyncio-eventloops.html).4647Пример использования [`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.ProactorEventLoop) в Windows:4849```python50import asyncio, sys5152if sys.platform == 'win32':53 loop = asyncio.ProactorEventLoop()54 asyncio.set_event_loop(loop)55```5657## 18.5.2.3. Поддержка платформ5859Модуль [`asyncio`](https://python-all.ru/3.5/library/asyncio.html#module-asyncio) разработан как переносимый, но каждая платформа имеет свои тонкие различия и может не поддерживать все возможности [`asyncio`](https://python-all.ru/3.5/library/asyncio.html#module-asyncio).6061### 18.5.2.3.1. Windows6263Общие ограничения циклов событий Windows:6465- [`create_unix_connection()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.create_unix_connection) и [`create_unix_server()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.create_unix_server) не поддерживаются: семейство сокетов [`socket.AF_UNIX`](https://python-all.ru/3.5/library/socket.html#socket.AF_UNIX) специфично для UNIX66- [`add_signal_handler()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.add_signal_handler) и [`remove_signal_handler()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.remove_signal_handler) не поддерживаются67- `EventLoopPolicy.set_child_watcher()` не поддерживается. [`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.ProactorEventLoop) поддерживает подпроцессы. У него есть только одна реализация для наблюдения за дочерними процессами, настраивать её не нужно.6869[`SelectorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.SelectorEventLoop)Специфические ограничения:7071- [`SelectSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectSelector) используется, он поддерживает только сокеты и ограничен 512 сокетами.72- [`add_reader()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.add_reader) и [`add_writer()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.add_writer) принимают только файловые дескрипторы сокетов73- Каналы не поддерживаются (например: [`connect_read_pipe()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.connect_read_pipe), [`connect_write_pipe()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.connect_write_pipe))74- [Подпроцессы](https://python-all.ru/3.5/library/asyncio-subprocess.html#asyncio-subprocess) не поддерживаются (например: [`subprocess_exec()`](https://python-all.ru/3.5/library/asyncio-subprocess.html#asyncio.AbstractEventLoop.subprocess_exec), [`subprocess_shell()`](https://python-all.ru/3.5/library/asyncio-subprocess.html#asyncio.AbstractEventLoop.subprocess_shell))7576[`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.ProactorEventLoop)Специфические ограничения:7778- [`create_datagram_endpoint()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.create_datagram_endpoint) (UDP) не поддерживается.79- [`add_reader()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.add_reader) и [`add_writer()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.add_writer) не поддерживаются.8081Разрешение монотонных часов в Windows обычно составляет около 15,6 мс. Наилучшее разрешение – 0,5 мс. Разрешение зависит от оборудования (наличие [HPET](https://python-all.ru/3.5/library/asyncio-eventloops.html)) и от конфигурации Windows. См. [отложенные вызовы asyncio](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio-delayed-calls).8283Изменено в версии 3.5: [`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.ProactorEventLoop) теперь поддерживает SSL.8485### 18.5.2.3.2. Mac OS X8687Символьные устройства, такие как PTY, хорошо поддерживаются только начиная с Mavericks (Mac OS 10.9). Они вообще не поддерживаются на Mac OS 10.5 и старше.8889На Mac OS 10.6, 10.7 и 10.8 цикл событий по умолчанию – это [`SelectorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.SelectorEventLoop), который использует [`selectors.KqueueSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.KqueueSelector). [`selectors.KqueueSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.KqueueSelector) не поддерживает символьные устройства на этих версиях. [`SelectorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.SelectorEventLoop) можно использовать с [`SelectSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.SelectSelector) или [`PollSelector`](https://python-all.ru/3.5/library/selectors.html#selectors.PollSelector) для поддержки символьных устройств на этих версиях Mac OS X. Пример:9091```python92import asyncio93import selectors9495selector = selectors.SelectSelector()96loop = asyncio.SelectorEventLoop(selector)97asyncio.set_event_loop(loop)98```99100## 18.5.2.4. Политики цикла событий и политика по умолчанию101102Управление циклом событий абстрагируется с помощью шаблона *политика*, чтобы обеспечить максимальную гибкость для нестандартных платформ и фреймворков. В ходе выполнения процесса единственный глобальный объект политики управляет циклами событий, доступными процессу, в зависимости от контекста вызова. Политика – это объект, реализующий интерфейс [`AbstractEventLoopPolicy`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.AbstractEventLoopPolicy).103104Большинству пользователей [`asyncio`](https://python-all.ru/3.5/library/asyncio.html#module-asyncio) никогда не приходится явно работать с политиками, поскольку глобальной политики по умолчанию достаточно.105106Политика по умолчанию определяет контекст как текущий поток и управляет одним циклом событий на поток, взаимодействующим с [`asyncio`](https://python-all.ru/3.5/library/asyncio.html#module-asyncio). Функции уровня модуля [`get_event_loop()`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.get_event_loop) и [`set_event_loop()`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.set_event_loop) предоставляют удобный доступ к циклам событий, управляемым политикой по умолчанию.107108## 18.5.2.5. Интерфейс политики цикла событий109110Политика цикла событий должна реализовывать следующий интерфейс:111112#### `class asyncio.AbstractEventLoopPolicy`113114Политика цикла событий.115116#### `get_event_loop()`117118Возвращает цикл событий для текущего контекста.119120Возвращает объект цикла событий, реализующий интерфейс [`AbstractEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop) .121122Вызывает исключение, если для текущего контекста не задан цикл событий и текущая политика не предписывает его создать. Он никогда не должен возвращать `None`.123124#### `set_event_loop(loop)`125126Устанавливает цикл событий для текущего контекста равным *loop*.127128#### `new_event_loop()`129130Создаёт и возвращает новый объект цикла событий в соответствии с правилами этой политики.131132Если необходимо установить этот цикл в качестве цикла событий для текущего контекста, [`set_event_loop()`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.set_event_loop) должен быть вызван явно.133134## 18.5.2.6. Доступ к глобальной политике цикла135136#### `asyncio.get_event_loop_policy()`137138Возвращает текущую политику цикла событий.139140#### `asyncio.set_event_loop_policy(policy)`141142Устанавливает текущую политику цикла событий. Если *политика* равна `None`, восстанавливается политика по умолчанию.143