Цикл событий в Python — как используется
В этом руководстве вы узнаете о цикле событий и о том, как Python использует его для реализации модели параллелизма с использованием одного потока.
Что такое цикл событий в Python?
Параллелизм означает, что несколько задач могут выполняться одновременно. Встроенный пакет asyncio позволяет запускать задачи одновременно, используя один поток.
Для реализации модели однопоточного параллелизма модуль asyncio использует конструкцию event loop, называемую циклом событий. Чтобы понять, как работает цикл событий в Python, рассмотрим пример записи данных в файл.
При записи данных в файл вы выполняете следующие шаги:
- Открыть файл
- Записать данные в файл и дождаться завершения
- Закрыть файл
В этом потоке вторая задача — блокировка. Внутри это работает так:
- Сначала функция, записывающая данные в файл, отправляет данные в операционную систему(ОС).
- Во-вторых, ОС берет на себя управление и начинает записывать данные в файл.
- В-третьих, ОС уведомляет программу после завершения записи файла.
Для управления уведомлениями разные ОС используют разные системы уведомлений о событиях. Например:
Операционные системы | Система уведомлений о событиях |
---|---|
Linux | epoll |
Windows | I/O completion port (IOCP) |
macOS | kqueue |
Эти системы уведомления о событиях позволяют нам добиться параллелизма, используя один поток. Пока программа ожидает уведомления ОС о завершении, она может запускать другой код.
В однопоточной модели параллелизма у нас есть только один поток, выполняющий код Python в любой момент времени. Когда мы сталкиваемся с задачей, связанной с вводом-выводом, мы передаем ее системе уведомления о событиях операционной системы и запускаем другой код.
Когда задача, связанная с вводом-выводом, завершится, мы можем возобновить задачу, ожидающую результата, и выполнить код.
Чтобы отслеживать задачи ввода-вывода, ожидающие результатов, пакет asyncio использует цикл событий. На следующем рисунке показано, как работает цикл событий:
Как это работает.
- Сначала основной поток отправляет задачи в очередь задач.
- Во-вторых, цикл событий постоянно отслеживает очередь задач и запускает задачу до тех пор, пока она не будет счетчиком задач ввода-вывода. В этом случае цикл событий приостанавливает задачу и передает ее ОС.
- В-третьих, нужно проверить выполненные задачи ввода-вывода. Если задача выполнена, ОС уведомит об этом программу. Затем цикл событий запускает задачи, не поставленные на паузу.
Эти шаги повторяются до тех пор, пока очередь задач не станет пустой.
До версии Python 3.7 вам приходилось создавать цикл событий и запускать задачи вручную. К счастью, после Python 3.7 пакет asyncio предоставляет некоторые функции, которые позволяют автоматически управлять циклом событий, поэтому вам не нужно иметь дело с низкоуровневым API.