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