Python·100 питань

Як запустити кілька async завдань паралельно?

Відповідь

Запуск кількох асинхронних завдань паралельно є базовим патерном проєктування під час розробки ефективних веб-додатків і парсерів мовою Python. Коли програмі потрібно надіслати десяток незалежних мережевих запитів до різних API або завантажити безліч сторінок одночасно, послідовне виконання кожної операції призведе до невиправданого зростання часу роботи. Асинхронна модель дозволяє ініціювати всі ці процеси одночасно й дочікуватися їх завершення в єдиній точці програми.

Для реалізації паралельного виконання корутин у стандартній бібліотеці передбачено набір зручних інструментів.

Функція asyncio.create_task обгортає корутину в об'єкт завдання і одразу ж ставить її в чергу на виконання в циклі подій, запускаючи процес у фоновому режимі.
Функція asyncio.gather приймає список створених завдань або корутин і призупиняє виконання функції доти, доки всі вони не завершать свою роботу, після чого повертає зібрані результати.
Клас asyncio.Semaphore використовується для обмеження максимальної кількості одночасно працюючих завдань, що критично при запитах до сторонніх серверів задля уникнення блокування за IP.

Під час роботи з безліччю паралельних завдань вкрай важливо правильно обробляти можливі винятки. За замовчуванням функція gather припиняє роботу та підіймає виняток у разі падіння хоча б одного завдання. Щоб цього уникнути, можна передати параметр return_exceptions=true, після чого в результуючому списку замість винятків будуть повернуті об'єкти помилок, які можна обробити окремо для кожного запиту.

Також не варто забувати про захист від зависань за допомогою таймаутів. Обгортання виклику gather у конструкцію обмеження часу гарантує, що програма не чекатиме нескінченно на завислий сервер, а коректно перерве завислі операції та звільнить ресурси. Такий комплексний підхід забезпечує високу відмовоустойчивість і максимальну швидкість виконання асинхронного коду за будь-яких умов.

Чи корисна ця відповідь?

Інші питання цієї теми

Пов’язані питання з інших тем