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.

Ссылка
скопирована
Получите бесплатные уроки на наших курсах
Все курсы
Еще по теме:
img
Рассказываем про профессию, где можно легально и за хорошие деньги почувствовать себя хакером
img
Рассказываем, как наука о данных помогает бизнесу в различных сферах
img
Рассказываем, какие специальности наиболее перспективны в сфере науки о данных
img
Онлайн-обучение стало популярным способом освоения новой профессии, но не все курсы оправдывают ожидания. Мы собрали советы, которые помогут извлечь реальную пользу из образовательных программ и сделать обучение эффективным.
img
Проджект-менеджер в IT — востребованная профессия с зарплатой около 200 тысяч рублей в месяц. Важно иметь управленческие навыки и знание специфики ИТ для успешной карьеры.