Spec-Zone.ru › Python 3.13

Политики

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

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

Пользовательские политики цикла событий могут управлять поведением функций get_event_loop(), set_event_loop() и new_event_loop().

Объекты политик должны реализовывать API, определённые в абстрактном базовом классе AbstractEventLoopPolicy.

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

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

asyncio.get_event_loop_policy()

Возвращает политику, действующую в текущем процессе.

asyncio.set_event_loop_policy(policy)

Устанавливает policy в качестве политики, действующей в текущем процессе.

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

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

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

class asyncio.AbstractEventLoopPolicy

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

get_event_loop()

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

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

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

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

set_event_loop(loop)

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

new_event_loop()

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

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

get_child_watcher()

Получает объект наблюдателя за дочерними процессами.

Возвращает объект наблюдателя, реализующий интерфейс AbstractChildWatcher.

Эта функция предназначена только для Unix.

Устарело с версии 3.12.

set_child_watcher(watcher)

Устанавливает watcher в качестве текущего наблюдателя за дочерними процессами.

Эта функция предназначена только для Unix.

Устарело с версии 3.12.

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

class asyncio.DefaultEventLoopPolicy

Политика asyncio по умолчанию. Использует SelectorEventLoop в Unix и ProactorEventLoop в Windows.

Устанавливать политику по умолчанию вручную не требуется. asyncio автоматически настроен на её использование.

Изменено в версии 3.8: В Windows теперь по умолчанию используется ProactorEventLoop.

Устарело с версии 3.12: Метод get_event_loop() политики asyncio по умолчанию теперь выдаёт предупреждение DeprecationWarning, если текущий цикл событий не установлен и метод решает создать его. В одном из будущих выпусков Python это станет ошибкой.

class asyncio.WindowsSelectorEventLoopPolicy

Альтернативная политика цикла событий, использующая реализацию цикла событий SelectorEventLoop.

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

class asyncio.WindowsProactorEventLoopPolicy

Альтернативная политика цикла событий, использующая реализацию цикла событий ProactorEventLoop.

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

Наблюдатели за процессами

Наблюдатель за процессами позволяет настраивать способ, которым цикл событий отслеживает дочерние процессы в Unix. В частности, циклу событий необходимо знать, когда дочерний процесс завершился.

В asyncio дочерние процессы создаются с помощью функций create_subprocess_exec() и loop.subprocess_exec().

В asyncio определён абстрактный базовый класс AbstractChildWatcher, который должны реализовывать наблюдатели за дочерними процессами. Также доступны четыре реализации: ThreadedChildWatcher (используется по умолчанию), MultiLoopChildWatcher, SafeChildWatcher и FastChildWatcher.

См. также раздел Подпроцессы и потоки.

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

asyncio.get_child_watcher()

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

Устарело с версии 3.12.

asyncio.set_child_watcher(watcher)

Устанавливает watcher в качестве текущего наблюдателя за дочерними процессами для текущей политики. watcher должен реализовывать методы, определённые в базовом классе AbstractChildWatcher.

Устарело с версии 3.12.

Примечание

Сторонние реализации циклов событий могут не поддерживать пользовательские наблюдатели за дочерними процессами. В таких циклах событий использование set_child_watcher() может быть запрещено или не иметь эффекта.

class asyncio.AbstractChildWatcher
add_child_handler(pid, callback, *args)

Регистрирует новый обработчик дочернего процесса.

Настраивает вызов callback(pid, returncode, *args) при завершении процесса с PID, равным pid. Если для того же процесса указать другой callback, он заменит предыдущий обработчик.

Вызываемый объект callback должен быть потокобезопасным.

remove_child_handler(pid)

Удаляет обработчик процесса с PID, равным pid.

Функция возвращает True, если обработчик успешно удалён, и False, если удалять было нечего.

attach_loop(loop)

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

Если наблюдатель ранее был подключён к циклу событий, сначала он отключается от него, а затем подключается к новому циклу.

Примечание: значение loop может быть None.

is_active()

Возвращает True, если наблюдатель готов к использованию.

Запуск подпроцесса при неактивном текущем наблюдателе за дочерними процессами вызывает исключение RuntimeError.

Добавлено в версии 3.8.

close()

Закрывает наблюдателя.

Этот метод необходимо вызвать, чтобы гарантировать освобождение базовых ресурсов.

Устарело с версии 3.12.

class asyncio.ThreadedChildWatcher

Эта реализация запускает отдельный поток ожидания для каждого созданного подпроцесса.

Она надёжно работает, даже если цикл событий asyncio запущен не в главном потоке ОС.

При обработке большого количества дочерних процессов заметных накладных расходов нет (O(1) при каждом завершении дочернего процесса), однако создание отдельного потока для каждого процесса требует дополнительной памяти.

Этот наблюдатель используется по умолчанию.

Добавлено в версии 3.8.

class asyncio.MultiLoopChildWatcher

При создании эта реализация регистрирует обработчик сигнала SIGCHLD. Это может нарушить работу стороннего кода, который устанавливает собственный обработчик сигнала SIGCHLD.

Наблюдатель не мешает другому коду запускать процессы: при получении сигнала SIGCHLD он явно опрашивает каждый процесс.

После установки наблюдателя запускать подпроцессы из разных потоков можно без ограничений.

Это решение безопасно, но при обработке большого количества процессов имеет значительные накладные расходы (O(n) при каждом получении SIGCHLD).

Добавлено в версии 3.8.

Устарело с версии 3.12.

class asyncio.SafeChildWatcher

Эта реализация использует активный цикл событий главного потока для обработки сигнала SIGCHLD. Если в главном потоке нет работающего цикла событий, другой поток не сможет запустить подпроцесс (возникает исключение RuntimeError).

Наблюдатель не мешает другому коду запускать процессы: при получении сигнала SIGCHLD он явно опрашивает каждый процесс.

Это решение так же безопасно, как MultiLoopChildWatcher, и имеет такую же сложность O(n), но для работы требует запущенного цикла событий в главном потоке.

Устарело с версии 3.12.

class asyncio.FastChildWatcher

Эта реализация собирает завершившиеся процессы, напрямую вызывая os.waitpid(-1), что может нарушить работу другого кода, запускающего процессы и ожидающего их завершения.

При обработке большого количества дочерних процессов заметных накладных расходов нет (O(1) при каждом завершении дочернего процесса).

Для работы этому решению, как и SafeChildWatcher, требуется запущенный цикл событий в главном потоке.

Устарело с версии 3.12.

class asyncio.PidfdChildWatcher

Эта реализация опрашивает дескрипторы файлов процессов (pidfds), чтобы дождаться завершения дочерних процессов. В некотором смысле PidfdChildWatcher — это «золотая середина» среди реализаций наблюдателей за дочерними процессами. Она не требует сигналов или потоков, не мешает процессам, запущенным вне цикла событий, и линейно масштабируется с ростом числа подпроцессов, запущенных циклом событий. Главный недостаток заключается в том, что pidfds доступны только в Linux и работают лишь в новых ядрах (версии 5.3 и выше).

Добавлено в версии 3.9.

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

Для реализации новой политики цикла событий рекомендуется создать подкласс DefaultEventLoopPolicy и переопределить методы, поведение которых требуется изменить, например:

class MyEventLoopPolicy(asyncio.DefaultEventLoopPolicy):

    def get_event_loop(self):
        """Get the event loop.

        This may be None or an instance of EventLoop.
        """
        loop = super().get_event_loop()
        # Do something with loop ...
        return loop

asyncio.set_event_loop_policy(MyEventLoopPolicy())

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/asyncio-policy.html

Spec-Zone.ru

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