Spec-Zone.ru › Python 3.12

Политики

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

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

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

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

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

Примечание: 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

Эта реализация опрашивает дескрипторы файлов процессов (pidfd), чтобы ожидать завершения дочерних процессов. В некоторых отношениях PidfdChildWatcher — это «золотая середина» среди реализаций наблюдателей за дочерними процессами. Для неё не нужны сигналы или потоки, она не мешает процессам, запущенным вне цикла событий, и масштабируется линейно в зависимости от числа подпроцессов, запущенных циклом событий. Главный недостаток заключается в том, что pidfd доступны только в 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.12/library/asyncio-policy.html

Spec-Zone.ru

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