Документация — https://docs.python.org/3/library/asyncio.html
Для изучения asyncio очень важно понимать контекст его устройства. Асинхронность невозможно понять, опираясь только на чужой код, поэтому в этом разделе будет много теории. Настоятельно рекомендую гуглить все понятия и детали.
Итак, асинхронная функция — это сопрограмма, или корутина, или же coroutine.
В соответствии с документацией, asyncio «предоставляет инфраструктуру для написания параллельного кода с использованием сопрограмм, мультиплексирования, доступа ввода-вывода через сокеты и других ресурсов. Она также подходит для запуска серверов и других систем, нуждающихся в асинхронности». Этот раздел курса не предназначен для охвата всего, что можно сделать с asyncio — это очень обширная тема. Но вы уже сможете использовать асинхронность при написании своих скраперов и парсеров.
В этом разделе вы научитесь понимать абстракцию и концепцию асинхронного подхода, напишете свои первые асинхронные скраперы, изучите инструментарий, который поможет вам практиковаться и решать задачи. Мы рассмотрим различия синхронного и асинхронного подходов, а также преимущества и недостатки каждого из них. Проведем несколько мысленных «экспериментов» для лучшего понимания концепции асинхронности. Изучим такие вещи, как coroutines, await, event loop, aiohttp, aiofile; научимся работать с task, gather и многим другим.
Для начала было бы здорово понять, что такое асинхронность, и дать ей определение. Модуль asyncio предоставляет нам цикл событий (event loop). Большую часть времени цикл событий ожидает, пока что-то произойдет, затем реагирует на событие и возвращает результат. Это основная концепция асинхронности, и мы будем рассматривать её под разными углами, чтобы сделать максимально понятной.
Модуль asyncio имеет несколько реализаций цикла событий. Какая реализация наиболее эффективна, зависит от вашей операционной системы. Это происходит «под капотом», и чаще всего вам даже не стоит об этом думать; достаточно просто знать об этом. Если вам это понадобится, вы можете выбрать цикл событий явно, но это уже после того, как вы хорошо разберётесь в теме.
Когда в цикле событий происходит событие А, он должен отреагировать событием Б. Представьте себе сервер, ожидающий, когда кто-то придёт и запросит данные, например, веб-страницу. Когда сервер получил запрос, он должен среагировать и отдать данные незамедлительно. Эта реакция известна как обработка событий. Если ваш сервер настолько плох, что не умеет в асинхронность, он будет вызывать один обработчик для одного пользователя. Что в этом такого ужасного? — спросите вы. А теперь представьте, что в один прекрасный день ваш сайт стал популярным, и количество запросов выросло в миллион раз. Сколько времени пройдёт, пока ваш сервер дойдёт до обслуживания последнего пользователя? Ответ: очень много.
Модуль asyncio призван решать эту проблему. Если среди вас есть разработчики на Django, они знают, что полноценную асинхронность в него добавили из коробки совсем недавно. Это означает, что знание и понимание асинхронности дают вам несколько дополнительных баллов на собеседовании или на фрилансе.