Spec-Zone.ru › Python 3.9

Политики

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

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

Используя пользовательскую политику цикла событий, можно настроить поведение функций 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.

set_child_watcher(watcher)

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

Эта функция специфична для Unix.

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

class asyncio.DefaultEventLoopPolicy

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

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

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

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()

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

asyncio.set_child_watcher(watcher)

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

Примечание

Реализации циклов событий сторонних разработчиков могут не поддерживать пользовательских наблюдателей за дочерними процессами. Для таких циклов событий использование 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()

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

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

class asyncio.ThreadedChildWatcher

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

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

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

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

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

class asyncio.MultiLoopChildWatcher

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

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

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

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

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

class asyncio.SafeChildWatcher

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

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

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

class asyncio.FastChildWatcher

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

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

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

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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/asyncio-policy.html

Spec-Zone.ru

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