> **Источник:** https://python-all.ru/3.5/library/asyncio-eventloops.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

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

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

Следующие функции представляют собой удобные сокращения для доступа к методам gлобальной политики. Обратите внимание, что это обеспечивает доступ к политике по умолчанию, если только альтернативная политика не была установлена вызовом [`set_event_loop_policy()`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.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. Доступные циклы событий

asyncio в настоящее время предоставляет две реализации циклов событий: [`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).

#### `class asyncio.SelectorEventLoop`

Цикл событий, основанный на модуле [`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).

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

В Windows поддерживаются только сокеты (например, каналы не поддерживаются): см. [документацию MSDN по select](https://python-all.ru/3.5/library/asyncio-eventloops.html).

#### `class asyncio.ProactorEventLoop`

Proactor-цикл событий для Windows, использующий «I/O Completion Ports» (также известные как IOCP). Подкласс [`AbstractEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop).

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

> **См. также**
>
> [документация MSDN по портам завершения ввода-вывода](https://python-all.ru/3.5/library/asyncio-eventloops.html).

Пример использования [`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.ProactorEventLoop) в Windows:

```python
import asyncio, sys

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

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

Модуль [`asyncio`](https://python-all.ru/3.5/library/asyncio.html#module-asyncio) разработан как переносимый, но каждая платформа имеет свои тонкие различия и может не поддерживать все возможности [`asyncio`](https://python-all.ru/3.5/library/asyncio.html#module-asyncio).

### 18.5.2.3.1. Windows

Общие ограничения циклов событий Windows:

- [`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) специфично для UNIX
- [`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) не поддерживаются
- `EventLoopPolicy.set_child_watcher()` не поддерживается. [`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.ProactorEventLoop) поддерживает подпроцессы. У него есть только одна реализация для наблюдения за дочерними процессами, настраивать её не нужно.

[`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) используется, он поддерживает только сокеты и ограничен 512 сокетами.
- [`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) принимают только файловые дескрипторы сокетов
- Каналы не поддерживаются (например: [`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))
- [Подпроцессы](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))

[`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.ProactorEventLoop)Специфические ограничения:

- [`create_datagram_endpoint()`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop.create_datagram_endpoint) (UDP) не поддерживается.
- [`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) не поддерживаются.

Разрешение монотонных часов в 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).

Изменено в версии 3.5: [`ProactorEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.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`](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. Пример:

```python
import asyncio
import selectors

selector = selectors.SelectSelector()
loop = asyncio.SelectorEventLoop(selector)
asyncio.set_event_loop(loop)
```

## 18.5.2.4. Политики цикла событий и политика по умолчанию

Управление циклом событий абстрагируется с помощью шаблона *политика*, чтобы обеспечить максимальную гибкость для нестандартных платформ и фреймворков. В ходе выполнения процесса единственный глобальный объект политики управляет циклами событий, доступными процессу, в зависимости от контекста вызова. Политика – это объект, реализующий интерфейс [`AbstractEventLoopPolicy`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.AbstractEventLoopPolicy).

Большинству пользователей [`asyncio`](https://python-all.ru/3.5/library/asyncio.html#module-asyncio) никогда не приходится явно работать с политиками, поскольку глобальной политики по умолчанию достаточно.

Политика по умолчанию определяет контекст как текущий поток и управляет одним циклом событий на поток, взаимодействующим с [`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) предоставляют удобный доступ к циклам событий, управляемым политикой по умолчанию.

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

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

#### `class asyncio.AbstractEventLoopPolicy`

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

#### `get_event_loop()`

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

Возвращает объект цикла событий, реализующий интерфейс [`AbstractEventLoop`](https://python-all.ru/3.5/library/asyncio-eventloop.html#asyncio.AbstractEventLoop) .

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

#### `set_event_loop(loop)`

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

#### `new_event_loop()`

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

Если необходимо установить этот цикл в качестве цикла событий для текущего контекста, [`set_event_loop()`](https://python-all.ru/3.5/library/asyncio-eventloops.html#asyncio.set_event_loop) должен быть вызван явно.

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

#### `asyncio.get_event_loop_policy()`

Возвращает текущую политику цикла событий.

#### `asyncio.set_event_loop_policy(policy)`

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