img

Погружение в aiogram (#0 Основы асинхронного программирования asyncio)

 

Введение

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

НО для начала, необходимо уяснить некоторые тонкости асинхронного программирования Python

Если ещё не знакомы с языком Python, то у меня для вас отличные новости -> Python с нуля

Немного теории

Асинхронное программирование - это когда отправили младшего брата в магазин за хлебом, а сами изучаете сериальчики, при этом не мешая маме готовить суп.

Если перенести это на программу, то приготовление супа это основной поток выполнения программы, а поход в магазин и просмотр сериалов это задачи (Корутины), которые выполняются одновременно, не мешая друг другу.

А что это за непонятное слово - Корутины?!

Корутины - это задачи, а если переходить на программирование, то блоки кода, которые работают асинхронно, то есть, одновременно, никак не мешая друг другу.

Для реализации асинхронного программирования в Python, есть прекрасная библиотека asyncio.

Установка библиотеки

(Note: здесь и в дальнейших статьях я буду все примеры кода запускать в IDE PyCharm и использовать версию Python 3.9)

Для начало установим библиотеку asyncio в только что созданный проект.

Для продвинутых программистов: можно воспользоваться командой: pip install asyncio

Для тех у кого лапки. 

Находим: Settings -> Project <ИмяПроекта> -> Python Interpreter->

 

->

После успешной установки пакета, открываем файл и начинаем творить.

Практика

Подключаем библиотеку asyncio и напишем три функции.

async def watch_serials() - Функция для просмотра сериала, которая непрерывно, каждые 5 секунд, отправляет в терминал текст сообщения: “Я смотрю сериалы”.

async def shop_bread() - Функция похода в магазин за хлебом, которая непрерывно, каждые 2 секунды, отправляет текст сообщение: “Я иду в магазин”.

async def cooking_soup() - Функция приготовления мамой супа, которая будет основным потоком выполнения программы. 

Я добавил while True: ,чтобы зациклить выполнение программы.

Сразу давайте оговоримся, что же такое async?

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

Задержку вывода сообщения организовали за счет встроенного ключевого слова await.

Давайте более подробно разберем написанный код.

await asyncio.sleep(время в сек.)

Данная функция аналогична функции 
time.sleep(время в сек.) за тем лишь исключением, что функция await asyncio.sleep(время в сек.) не блокирует выполнение основного потока программы. Это означает, что она выполняется асинхронно, и пока в одном месте программы, где есть эта функция, мы ждём, завершения задержки, основному потоку ничто не мешает выполнять любой другой участок кода, как в нашем случае функцию похода в магазин.

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

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

В функции cooking_soup() создаем наши задачи для запуска их выполнения с помощью функции asyncio.create_task(корутина)

И ставим отдельный поток на их выполнения с помощью строки await task_1.

Запускаем выполнение нашего основного потока, то есть функцию cooking_soup() с помощью метода run() библиотеки asyncio

asyncio.run(cooking_soup())

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

 

Код программы

import asyncio

 

 

async def watch_serials():

   while True:

       await asyncio.sleep(5)

       print('Я смотрю сериалы "Task_1"')

 

 

async def shop_bread():

   while True:

       await asyncio.sleep(2)

       print('Я иду в магазин "Task_2"')

 

 

async def cooking_soup():

   task_1 = asyncio.create_task(watch_serials())

   task_2 = asyncio.create_task(shop_bread())

 

   await task_1

   await task_2

 

 

if __name__ == '__main__':

   asyncio.run(cooking_soup())

 

Заключение

 

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

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
DevOps
Скидка 25%
DevOps-инженер с нуля
Научитесь использовать инструменты и методы DevOps для автоматизации тестирования, сборки и развертывания кода, управления инфраструктурой и ускорения процесса доставки продуктов в продакшн. Станьте желанным специалистом в IT-индустрии и претендуйте на работу с высокой заработной платой.
Получи бесплатный
вводный урок!
Пожалуйста, укажите корректный e-mail
отправили вводный урок на твой e-mail!
Получи все материалы в telegram и ускорь обучение!
img
Еще по теме:
img
Проджект-менеджер в IT — это динамичная и востребованная профессия. Здесь важно владеть управленческими навыками и разбираться в
img
Онлайн-обучение стало популярным инструментом для того, чтобы освоить новую профессию. Но далеко не каждый курс оправдывает свои
img
Когда-то способность машин понимать и обрабатывать человеческий язык была научной фантастикой. Теперь это возможно благодаря NLP
img
  Введение На сегодняшний день боты стали неотъемлемой частью нашей жизни. Они помогают в автоматизации процессов, экономии чело
img
  За последнее время каждый из нас слышал, что искусственный интеллект внедряется повсеместно, давайте же разберемся; как и где
img
Когда вы начинаете свой путь в программировании, легко потеряться среди незнакомых терминов и информации. Кажется, что опытные п
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59