Рубрики
Без рубрики

Концепции асинхронного параллелизма

Автор оригинала: Doug Hellmann.

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

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

Приложение явно взаимодействует с циклом событий, чтобы зарегистрировать код для запуска, и позволяет циклу событий делать необходимые вызовы в код приложения, когда ресурсы доступны. Например, сетевой сервер открывает сокеты, а затем регистрирует их, чтобы получать информацию о событиях ввода на них. Цикл событий предупреждает код сервера, когда есть новое входящее соединение или когда есть данные для чтения. Ожидается, что код приложения снова вернет управление через короткий промежуток времени, когда в текущем контексте больше нельзя выполнять работу. Например, если больше нет данных для чтения из сокета, сервер должен передать управление циклу обработки событий.

Механизм возврата управления циклу событий зависит от сопрограмм Python, специальных функций, которые передают управление вызывающему без потери своего состояния. Сопрограммы аналогичны функциям генераторов, и на самом деле генераторы могут использоваться для реализации сопрограмм в версиях Python ранее, чем 3.5, без встроенной поддержки объектов сопрограмм. asyncio также предоставляет уровень абстракции на основе классов для протоколов и транспортов для написания кода с использованием обратных вызовов вместо написания сопрограмм напрямую. И в моделях на основе классов, и в моделях сопрограмм явное изменение контекста путем повторного входа в цикл событий заменяет неявные изменения контекста в реализации потоковой передачи Python.

future – это структура данных, представляющая результат еще не завершенной работы. Цикл событий может следить за тем, чтобы объект Future был установлен в состояние done, позволяя одной части приложения ждать, пока другая часть завершит некоторую работу. Помимо фьючерсов, asyncio включает другие примитивы параллелизма, такие как блокировки и семафоры.

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