Ключові слова async і await в Python: синтаксис та приклади
Ключові слова async та await з’явилися в синтаксисі мови Python у версії 3.5, що вийшла в 2015 році. У поясненні до пропозиції PEP 492 її автор написав, що використання async/await допоможе зробити написання асинхронного, паралельного коду Python більш простим, і це наблизить асинхронне програмування до синхронного.
Вийшло це чи ні, вирішувати вам. Але спочатку з’ясуємо, навіщо потрібні ключові слова async і await у Python, і в якому сценарії їх можна використовувати.
Ключові слова async і await необхідні для реалізації асинхронності в Python. Завдяки ним можна виконувати операції без блокування основного потоку виконання програми.
Асинхронне програмування створює умови, в яких виконання завдань відбувається паралельно, а не по черзі. Тобто порядок виконання вже не такий важливий, друге завдання не чекає завершення першого. Це може бути помітно при виконанні багатьох операцій введення-виводу (наприклад при обробці запитів користувачів). Таким чином, асинхронне програмування прискорює роботу всієї програми, оскільки більш ефективно розподіляє ресурси.
Ключове слово async потрібне, щоб оголосити асинхронну функцію. Вона, у свою чергу, повертає об’єкт coroutine, який «очікується» за участі await.
async def my_async_function(): print("Welcome") await asyncio.sleep(1) # Імітує затримку print("Home")
Тепер поговоримо про await. Це ключове слово призупиняє виконання асинхронної функції до отримання результату з іншої асинхронної функції. Замість блокування потоку програма переходить до виконання інших завдань. У результаті це покращує продуктивність.
async def example(): await my_async_function() # Очікуємо виконання coroutine
Корутина (coroutine або співпрограма) у мові програмування Python — це особливий тип функції, який припускає припинення і поновлення у точці її виконання. Цим співпрограма відрізняється від звичних функцій, виконання яких відбувається до завершення. Ще однією особливістю співпрограм є те, що з нею можна виконувати асинхронні та багатозадачні операції всередині програми без застосування потоків або процесів. Іншими словами, із співпрограмою можна писати асинхронний код, який схожий на синхронний. Це робить додаток більш легкочитаним.
Корутина припиняється за допомогою введення ключового слова await. Це звільняє управління для роботи інших завдань. Потім, коли дані готові, вже не потрібно чекати: виконання поновлюється.
Як створити корутину? Для цього завдання Python є ключове слово async. Якщо використовувати його перед визначенням функції, то функція повертає об’єкт coroutine. Потім її можна використовувати для асинхронних завдань. Ось приклад створення корутини:
async def my_coroutine(): print("Start coroutine") await asyncio.sleep(1) print("End coroutine")
Як викликати корутину? Корутина чи співпрограма — це не зовсім звичайна функція, тому її не можна просто так викликати. Натомість потрібно використовувати ключове слово await, щоб дочекатися завершення виконання функції, або запускати корутину за допомогою таких конструкцій, як asyncio.run(). Подивіться на фрагмент коду:
import asyncio async def my_coroutine(): print("Welcome") await asyncio.sleep(1) # Імітує затримку print("Home") asyncio.run(my_coroutine()) # Запускає корутину
Чим корутина відрізняється від генератора? Співпрограми трохи схожі на генератори (які використовують yield), але їхнє завдання полягає в роботі суто з асинхронним кодом. До того ж у генераторах передача управління відбувається назад в основний код при кожному виклику yield, а в корутинах для цього застосовується await.
Використання переваг асинхронного програмування підвищує ефективність операцій введення-виведення. Оскільки завдання працюють у паралельному режимі (але в єдиному потоці), це скорочує час роботи програм та ресурси пам’яті.
Ще однією сферою використання ключового слова await у Python є awaitable object (очікуваний об’єкт) — об’єкт, який застосовується всередині асинхронних функцій. Призначення подібних об’єктів у тому, щоб представляти операції, які допускають зупинення та відновлення без блокування виконання програми.
Щоб легше зрозуміти переваги асинхронного програмування, давайте напишемо невелику програму роботи таймера, в коді якої є async і await.
import asyncio # Асинхронна функція для імітації таймера async def timer(name: str, seconds: int): print(f"Таймер {name} запущено на {seconds} секунд.") await asyncio.sleep(seconds) # Асинхронне очікування print(f"Таймер {name} завершено.") # Основна асинхронна функція для запуску кількох таймерів async def main(): # Запускаємо три таймери паралельно await asyncio.gather( timer("A", 5), timer("B", 4), timer("C", 8) ) # Запуск асинхронного коду asyncio.run(main())
Виведення:
Таймер A запущено на 5 секунд. Таймер B запущено на 4 секунди. Таймер C запущено на 8 секунд. Таймер B завершено. Таймер A завершено. Таймер C завершено.
Це простий приклад, що демонструє роботу з асинхронними завданнями та керуванням часом очікування з використанням async та await.
Резиденти Дія.City сплатили до бюджету понад 8 млрд грн податків в І кварталі 2025 року.…
У Китаї закликають офісних працівників не працювати надто багато — держава сподівається, що вільний час…
Експерти звертають увагу на тривожну тенденцію: люди все частіше використовують ChatGPT, щоб визначити місцезнаходження, зображене…
Компанія JetBrains випустила нову версію мультимовного середовища розробки IntelliJ IDEA 2025.1. Оновлена IDE отримала численні…
Платформа обміну миттєвими повідомленнями Discord впроваджує функцію перевірки віку за допомогою сканування обличчя. Зараз вона…
Wikipedia намагається захистити себе від тисяч різноманітних ботів-скрейперів, які сканують дані цієї платформи для навчання…