Python Асинхронное программирование

Python Асинхронное программирование весьма полезно.

Пламенный привет посетителям этой страницы, пришедшим из социальных сетей, да и всем остальным тоже!

В апреле 2021-го года наблюдал удивительное явление: обильный поток посетителей из 4-х социальных сетей. В связи с этим настоятельно рекомендую всем неоднократно и регулярно посещать сайт rtbsm.ru — там в общих чертах изложена Российская Теннисная Балльная Система Марии (Шараповой).

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

Главная проблема — известить Марию, чтобы она лично как можно скорее заявила на весь мир о РТБСМ.

Python Асинхронное программирование — способ существенно  повысить производительность программы за счёт одновременной работы нескольких процессов.

Привожу информацию со страницы https://dzen.ru/a/ZNyVxRV91lK6uJ0M :

Асинхронное программирование на Python

Контур.Школа
2,3 K подписчиков
16 августа 2023 г.
112 прочитали

Содержание статьи

  • Отличия между асинхронным и синхронным кодом
  • Где асинхронность применяется в реальном мире
  • Особенности асинхронного программирования Обычные функции
    Корутины
    Asyncio спешит на помощь
    Когда работы много

Отличия между асинхронным и синхронным кодом

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

Асинхронное программирование позволяет запускать операции параллельно, не дожидаясь выполнения последовательности. Это как если бы у вас было восемь рук и вы могли одновременно мыть посуду, пылесосить, читать газету и гладить кота. Жаль, что это невозможно в быту — зато вполне реально в разработке ПО. К тому же асинхронное программирование на Python становится все более популярным.

Где асинхронность применяется в реальном мире

Темы асинхронного программирования часто стараются избегать, особенно на начальных этапах изучения языка. Её считают сложной и относят к разряду «для посвящённых или одарённых» разработчиков. На самом деле «асинхронные дела» окружают нас буквально на каждом шагу.

Смотреть программу Основы PythonКурс для IT-специалистов — ()

Например, вы провожаете родственников и просите их позвонить, как только они доберутся до дома. А дальше спокойно занимаетесь своими делами и не названиваете им каждую минуту с проверкой: «Уже доехали?» Потому что звонок от родственников поступит сам, как только они доберутся до дома.

То есть функция «Звонок от родственников» ожидает события «Родственники приехали домой». И как только это событие произойдет, функция сразу сработает.

Или вы ставите напоминание в календаре на конкретную дату и время: «Созвон с коллегами». А потом напрочь забываете об этом событии. Но календарь не забудет!

Он обязательно напомнит об этом в указанное время. И ему плевать, что в этот момент вы можете мыться или стоять в трехчасовой пробке. Задача «Созвон с коллегами» находится в режиме ожидания. Она никак не мешает выполнению основной программы «Повседневная жизнь». Но как только наступит заранее заданное условие — дата и время, — эта функция активируется и вмешается в привычный ход жизни.

Особенности асинхронного программирования на Python

С чего начать изучение Python, как поймать Python-дзен и для чего этот язык пригодится в повседневной жизни, рассказываем на бесплатном вебинаре «Зачем специалисту Python?» — ()

Обычные функции

Давайте запрограммируем такую ситуацию с уведомлением. Повседневную жизнь представим с помощью функции main( ). А уведомление — с помощью функции notification( ).


Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.

Внутри функции notification( ) находится задержка в 10 секунд, чтобы имитировать отложенное задание. Если запустить код, то мы увидим, что поговорить с коллегой и поесть не удастся, потому что программа застынет на выполнении notification( ) и будет ждать 10 секунд, пока уведомление не придёт и не спасёт от голодной смерти

Очевидно, что есть и разговаривать с коллегой мы хотим в то время, пока идет обратный отсчет до уведомления. То есть важно сделать так, чтобы работа функции notification( ) не прерывала работу функции main( ).

Корутины

Чтобы решить этот вопрос, необходимо функцию notification( ) сделать асинхронной, то есть работающей независимо от всего остального. Для этого в начале приписываем магическое async.


Теперь, если запустим программу, она выполнится мгновенно! Мы и поедим, и с коллегой пообщаемся, вот только помимо этого получим странное предупреждение.

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-3

Что же произошло? async — это оператор Python, обертка над основной функцией. Теперь, когда вы вызовете функцию notification( ), она вернет специальный объект — корутину (coroutine).

  • Корутина тоже представляет собой функцию, которую нужно вызвать отдельно. Об этом и сообщает Python.

Обычный вызов notification( ) теперь не исполняет функцию, а превращает ее в корутину, которую нужно вызвать. Чтобы это сделать, используем оператор await.

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-4

Теперь запуск кода приведет к новой проблеме:

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-5

Python будет выполнять await только в том случае, если он будет вызван внутри асинхронной функции. То есть функцию main( ) необходимо тоже сделать асинхронной.

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-6

Но тогда мы получили еще одну корутину, которую также кто-то должен вызвать и сделать это опять только внутри асинхронной функции! Что же делать? Замкнутый круг

Asyncio спешит на помощь

Для управления асинхронными функциями в Python используется специальный модуль asyncio. Его поддержка впервые появилась в версии Python 3.5 в 2015 году. Добавим его к программе и запустим корутину main( ), используя метод run( ).

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-7

В терминах асинхронного программирования функция main( ) будет называться циклом обработки событий (event loop). Это основной цикл программы, который вызывает все асинхронные функции, необходимые для работы.

Теперь программа вновь заработает! Правда, уведомление о созвоне снова не даст поесть и пообщаться с коллегой… Все опять работает как обычная последовательность действий.

Дело в том, что недостаточно просто запустить корутину — необходимо создать задачу (task), которая это сделает.

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-8

Ура! Наконец можно спокойно пообедать, поговорить с коллегой и заняться любыми другими делами. А уведомление о встрече придет тогда, когда истечет таймер, — в нашем случае это 10 секунд.

Запустите программу и обратите внимание на последовательность работы функции print( ). Несмотря на то что «Едим» и «Разговариваем с коллегой» выполняются после вызова корутины notification( ), мы увидим их первыми, потому что корутина выполняется асинхронно относительно основного цикла обработки событий main( ).

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-9

Знатоки Python могут закидать меня помидорами за такой пример, так как на самом деле time.sleep( ) нельзя использовать при создании нескольких асинхронных событий внутри event loop. А также не хватает вызова корутины через await. Но не торопитесь: обо всем по порядку.

Когда работы много

СмотретьЗачем специалисту Python?Бесплатный вебинар

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

Создадим основную функцию, внутри которой будем вызывать функции, возвращающие данные для погодной станции. Чтобы имитировать задержки, воспользуемся функцией time.sleep( ). Также будем измерять общее время
работы программы с помощью time.time( ).

Традиционное решение — вызов функций друг за другом. Так как выполнение main( ) приостанавливается в момент вызова get_temp( ) и get_pres( ), несложно подсчитать, что общее время работы будет равно сумме времени, затраченного на выполнение всех функций, вызываемых внутри main( ).

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-11

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

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-12

Теперь, если запустим программу, увидим странную особенность: функции измерения работают последовательно — асинхронностью здесь и не пахнет. Программа выполняется все так же долго — 6 секунд. А терминал вообще вывел информацию в странном порядке.

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-13

Почему так происходит? Все дело в задержках, которые мы создали. Асинхронно сейчас выполняется только main( ) (цикл событий) относительно функций, которые он вызывает. Это видно по моментальному выводу о начале и конце измерения еще до того, как мы получили непосредственно сами данные.

А вот функции get_temp( ) и get_pres( ) выполняются последовательно, потому что внутри содержат обычную функцию time.sleep( ), тормозящую всю работу. Чтобы исправить этот эффект, необходимы корутины, которые будут создавать задержку и при этом не будут тормозить вызов других функций. Исправьте time.sleep( ) на asyncio.sleep( ) и не забудьте про await, ведь теперь мы работаем с корутинами.

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-14

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

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-15

Опять что-то не так… На самом деле все теперь работает корректно. Просто цикл событий main( ) не дожидается окончания работы асинхронных функций и завершает свою работу раньше, чем должен. У нас же теперь все асинхронное, зачем ему кого-то ждать?

И тут на помощь снова придет await. Этот оператор не только исполняет корутину, но еще и дает указание циклу событий дождаться завершения выполнения этих корутин прежде, чем завершиться самому. Вот в таком виде программа будет работать корректно — именно так, как планировалось:

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-16

И время выполнения программы сократилось до 4 секунд вместо 6:

Содержание статьи Отличия между асинхронным и синхронным кодом При синхронном программировании компьютер выполняет операции последовательно одну за другой.-17

Теперь в цикл событий main( ) можно добавить сколько угодно задач через asyncio. А общее время его работы всегда будет определяться временем работы самой долгой функции. Добро пожаловать в асинхронный мир!

Реклама
Nissan X-Trail New 2023
Внедорожник. 2023. 2.5 CVT (184 л.с.) 4WD. Узнать подробнее!
2 935 000 
атлас-авто.рф
Перейти на сайт
Комментарии 2
Войти, чтобы комментировать
Вам IDE подчеркнул await task1 и await task2, потому что надо использовать await asyncio.gather(task1, task2), либо await asyncio.wait([task1, task2])
Как у вас всё сложно в питоне…

!…

Приглашаю всех высказываться в Комментариях. Критику и обмен опытом одобряю и приветствую. В особо хороших комментариях сохраняю ссылку на сайт автора!

И не забывайте, пожалуйста, нажимать на кнопки социальных сетей, которые расположены под текстом каждой страницы сайта.
Python Асинхронное программированиеПродолжение тут…

Баннер

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Проверка комментариев включена. Прежде чем Ваши комментарии будут опубликованы пройдет какое-то время.