Политики
Политика цикла событий — это глобальный объект на процесс, который управляет обработкой цикла событий. Каждый цикл событий имеет политику по умолчанию, которую можно изменить и настроить с помощью 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, так и на Windows платформах.Нет необходимости устанавливать политику по умолчанию вручную. asyncio автоматически настроен на использование политики по умолчанию.
-
class asyncio.WindowsProactorEventLoopPolicy -
Альтернативная политика цикла событий, которая использует реализацию цикла событий
ProactorEventLoop.Доступность: Windows.
Наблюдатели процессов
Наблюдатель процессов позволяет настроить, как цикл событий отслеживает дочерние процессы на Unix. В частности, цикл событий должен знать, когда дочерний процесс завершил работу.
В asyncio дочерние процессы создаются с помощью функций create_subprocess_exec() и loop.subprocess_exec().
asyncio определяет абстрактный базовый класс AbstractChildWatcher, который должны реализовывать наблюдатели дочерних процессов, и имеет две различные реализации: 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.
-
close() -
Закрывает наблюдателя.
Этот метод необходимо вызвать, чтобы гарантировать очистку базовых ресурсов.
-
-
class asyncio.SafeChildWatcher -
Эта реализация избегает нарушения работы другого кода, запускающего процессы, путём явного опроса каждого процесса при поступлении сигнала
SIGCHLD.Это безопасное решение, но оно имеет значительную нагрузку при обработке большого количества процессов (O(n) каждый раз при получении сигнала
SIGCHLD).asyncio использует эту безопасную реализацию по умолчанию.
-
class asyncio.FastChildWatcher -
Эта реализация собирает все завершенные процессы, вызывая
os.waitpid(-1)напрямую, что может нарушать работу другого кода, запускающего процессы и ожидающего их завершения.Нет заметной нагрузки при обработке большого числа дочерних процессов (O(1) каждый раз при завершении дочернего процесса).
Настраиваемые политики
Для реализации новой политики цикла событий рекомендуется подклассировать 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–2020 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.7/library/asyncio-policy.html