redis-server --port 6380
brew services restart redis
Сопрограмма – это метод, который можно приостановить, если имеется потенциально длительная задача, а затем возобновить, когда она завершится.
Объект future: идентификатор асинхронного вызова функции, позволяющий проверять состояние вызова и получать результаты работы функции.
Комбинацию асинхронного вызова функции и объекта Future часто называют асинхронной задачей. Это так из-за того, что такая комбинация даёт больше возможностей, чем обычный вызов функции. Например — позволяет отменять запрос и выполнять другие действия.
Приёмы асинхронного программирования используются, в основном, в системах, предусматривающих применение неблокирующих операций ввода/вывода. Это, например, чтение данных из сокета или их запись в сокет при работе с другими процессами или системами.
Неблокирующий ввод/вывод — это когда программа запрашивает у системы чтение или запись неких данных, а соответствующие операции выполняются асинхронно. Вызывающей стороне не нужно ждать завершения операции перед переходом к другим задачам.
Операции чтения и записи выполняются тем или иным образом (например — операционной системой, или некими системами, построенными на её основе), а сведения о состоянии операций и/или данные, полученные в ходе их выполнения, вызывающая сторона получает позднее, как только они будут готовы, или когда вызывающая сторона готова будет их принять.
Асинхронный ввод/вывод: условное сокращение, которое означает комбинацию асинхронного программирование и неблокирующей обработки ввода/вывода.
Потоки асинхронны, то есть — они могут работать с разными скоростями, и любой поток может в любой момент остановиться на время, длительность которого заранее неизвестна.
Корутина: корутины — это более общая форма подпрограмм. Подпрограммы имеют одну точку входа и одну точку выхода. А корутины поддерживают множество точек входа, выхода и возобновления их выполнения.
Вызов функции корутины создаёт объект корутины, в основе которого лежит новый класс. При этом функция корутины не выполняется.
Корутина может запустить другую корутину посредством выражения await.
Асинхронный итератор — это итератор, который выдаёт объекты, допускающие ожидание.
Асинхронный итератор: объект, который реализует методы aiter() и anext(). Метод anext() должен возвращать объект, допускающий ожидание. Конструкция async for разрешает объекты, допускающие ожидание, возвращённые методом anext() асинхронного итератора до тех пор, пока он не вызовет исключение StopAsyncIteration.
Асинхронный менеджер контекста — это менеджер контекста, который может приостанавливать выполнение в своих методах enter и exit.
Выражение async with используется для создания и использования асинхронных менеджеров контекста.
Вызывающая корутина приостановится и подождёт менеджер контекста до входа в блок менеджера и похожим образом поступит при выходе из блока менеджера контекста.
Может возникнуть соблазн использовать существующие библиотеки ввода-вывода, обернув их сопрограммами. Однако при этом возникнут те же проблемы, что для счетных операций. Эти API будут блокировать главный поток. Поэтому, попытавшись выполнить блокирующий вызов API в сопрограмме, мы заблокируем сам поток цикла событий, а значит, воспрепятствуем выполнению всех остальных сопрограмм и задач. Примерами блокирующих API является библиотека requests или функция time.sleep. Вообще, любая функция, которая выполняет ввод-вывод, не являясь сопрограммой, или занимает процессор длительными операциями, может считаться блокирующей.