ASYNCIO PYTHON

Важно понить, что асинхронность это не паралельное выполнение задач, а кооперативная много задачность (то есть все процессы обязаны уступать задачи время другим, это происходит в моменты ожидания операций ввода-вывода.

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

Таким образом программа запрашивает цикл событий (функция get_event_loop – получает уже существующий или создает новыйс параметрами по умолчанию), дальше происходит запуск самого цикла метод run_forever. После чего цикл будет работать до тех пор пока его не остновят методом stop.

Более простой вариант с главной асинхронной задачей. Цикл событий создастся сам и будет работать до тех пор пока в цикле не завершатся задача, переданная в качестве параметра функци run.

Стоит отметить, что порождение новых задач например функцией create_task, никаки не влияет на завершение цикла событий, даже если задачи есть они все равно будет завершены вместе с осноным циклом событий после завершения основного метода.

Вывод этого скрипта будет следующим:

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

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

Однако код ниже выполнит абсолютно все задачи, так как завершение цикла событий не происходит:

ВАЖНО: не в коем случае не должно происходить блокирование цикла событий, например блокирующими не асинхронными операциями, так как, это оcтановит выполнение всех асинхронных задач.

Обсуждение закрыто.