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 должен быть потокобезопасным.

remove_child_handler(pid)

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

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

attach_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–2024 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