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

---

# Политики

> **Предупреждение**
>
> Политики устарели и будут удалены в Python 3.16. Пользователям рекомендуется использовать функцию [`asyncio.run()`](https://python-all.ru/3/library/asyncio-runner.html#asyncio.run) или [`asyncio.Runner`](https://python-all.ru/3/library/asyncio-runner.html#asyncio.Runner) с параметром *loop\_factory* для использования нужной реализации цикла событий.

Политика цикла событий – это глобальный объект, используемый для получения и установки текущего [цикла событий](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio-event-loop), а также для создания новых циклов событий. Стандартную политику можно [заменить](https://python-all.ru/3/library/asyncio-policy.html#asyncio-policy-get-set) на [встроенные альтернативы](https://python-all.ru/3/library/asyncio-policy.html#asyncio-policy-builtin) для использования других реализаций цикла событий или заменить [пользовательской политикой](https://python-all.ru/3/library/asyncio-policy.html#asyncio-custom-policies), которая может переопределять это поведение.

Объект [политики](https://python-all.ru/3/library/asyncio-policy.html#asyncio-policy-objects) получает и устанавливает отдельный цикл событий для каждого *контекста*. По умолчанию это выполняется для каждого потока, хотя пользовательские политики могут определять *контекст* иначе.

Пользовательские политики цикла событий могут управлять поведением [`get_event_loop()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.get_event_loop), [`set_event_loop()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.set_event_loop) и [`new_event_loop()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.new_event_loop).

Объекты политик должны реализовывать API, определённые в абстрактном базовом классе [`AbstractEventLoopPolicy`](https://python-all.ru/3/library/asyncio-policy.html#asyncio.AbstractEventLoopPolicy).

## Получение и установка политики

Следующие функции можно использовать для получения и установки политики для текущего процесса:

#### `asyncio.get_event_loop_policy()`

Возвращает текущую политику для всего процесса.

Устарело с версии 3.14: Функция `get_event_loop_policy()` устарела и будет удалена в Python 3.16.

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

Устанавливает текущую политику для всего процесса в *policy*.

Если для *policy* установлено значение `None`, восстанавливается стандартная политика.

Устарело с версии 3.14: Функция `set_event_loop_policy()` устарела и будет удалена в Python 3.16.

## Объекты политик

Абстрактный базовый класс политики цикла событий определяется следующим образом:

#### `class asyncio.AbstractEventLoopPolicy`

Абстрактный базовый класс для политик asyncio.

#### `get_event_loop()`

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

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

Этот метод никогда не должен возвращать `None`.

Изменено в версии 3.6.

#### `set_event_loop(loop)`

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

#### `new_event_loop()`

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

Этот метод никогда не должен возвращать `None`.

Устарело с версии 3.14: Класс `AbstractEventLoopPolicy` устарел и будет удален в Python 3.16.

asyncio включает следующие встроенные политики:

#### `class asyncio.DefaultEventLoopPolicy`

Политика asyncio по умолчанию. Использует [`SelectorEventLoop`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.SelectorEventLoop) в Unix и [`ProactorEventLoop`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.ProactorEventLoop) в Windows.

Нет необходимости устанавливать политику по умолчанию вручную. asyncio настроена на автоматическое использование политики по умолчанию.

Изменено в версии 3.8: В Windows [`ProactorEventLoop`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.ProactorEventLoop) теперь используется по умолчанию.

Изменено в версии 3.14: Метод [`get_event_loop()`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.get_event_loop) политики asyncio по умолчанию теперь вызывает [`RuntimeError`](https://python-all.ru/3/library/exceptions.html#RuntimeError), если цикл событий не установлен.

Устарело с версии 3.14: Класс `DefaultEventLoopPolicy` устарел и будет удалён в Python 3.16.

#### `class asyncio.WindowsSelectorEventLoopPolicy`

Альтернативная политика цикла событий, использующая реализацию цикла событий [`SelectorEventLoop`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.SelectorEventLoop).

[Доступность](https://python-all.ru/3/library/intro.html#availability): Windows.

Устарело с версии 3.14: Класс `WindowsSelectorEventLoopPolicy` устарел и будет удалён в Python 3.16.

#### `class asyncio.WindowsProactorEventLoopPolicy`

Альтернативная политика цикла событий, использующая реализацию цикла событий [`ProactorEventLoop`](https://python-all.ru/3/library/asyncio-eventloop.html#asyncio.ProactorEventLoop).

[Доступность](https://python-all.ru/3/library/intro.html#availability): Windows.

Устарело с версии 3.14: Класс `WindowsProactorEventLoopPolicy` устарел и будет удалён в Python 3.16.

## Пользовательские политики

Для реализации новой политики цикла событий рекомендуется создать подкласс [`DefaultEventLoopPolicy`](https://python-all.ru/3/library/asyncio-policy.html#asyncio.DefaultEventLoopPolicy) и переопределить методы, для которых требуется особое поведение, например:

```python
class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """Получить цикл событий.

        Это может быть None или экземпляр EventLoop.
        """
        loop = super().get_event_loop()
        # Сделать что-то с циклом ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())
```
