Рубріки: Основи

Ключові слова 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

Корутина (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.

Асинхронність та Awaitable object в Python

Використання переваг асинхронного програмування підвищує ефективність операцій введення-виведення. Оскільки завдання працюють у паралельному режимі (але в єдиному потоці), це скорочує час роботи програм та ресурси пам’яті.

Ще однією сферою використання ключового слова await у Python є awaitable object (очікуваний об’єкт) — об’єкт, який застосовується всередині асинхронних функцій. Призначення подібних об’єктів у тому, щоб представляти операції, які допускають зупинення та відновлення без блокування виконання програми.

Типи очікуваних об’єктів (awaitable objects):

  • Корутини: Асинхронні функції, що створюються через async def. Вони повертають корутину, на яку можна «очікувати» за допомогою await.
  • Tasks (Завдання): Це свого роду обгортки навколо корутин. При створенні завдання за допомогою asyncio.create_task() виникає об’єкт, який також є awaitable.
  • Future (Майбутні об’єкти): Це особливі об’єкти, які використовуються для представлення результату будь-якої майбутньої асинхронної операції. Вбудовані бібліотеки, такі як asyncio, надають такі об’єкти для роботи з подіями та результатами операцій.

 

Приклад програми на Python з використанням ключових слів async та await

Щоб легше зрозуміти переваги асинхронного програмування, давайте напишемо невелику програму роботи таймера, в коді якої є 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())

 

  • У коді, наведеному вище, ми бачимо функцію timer, що знаходиться в режимі очікування протягом зазначеної кількості секунд.
  • У функції main є три таймери, які запускаються одночасно за допомогою asyncio.gather. Це дозволяє їм працювати паралельно.
  • Кожен таймер працює асинхронно, тому програма не блокується під час їх очікування.

Виведення:

Таймер A запущено на 5 секунд.
Таймер B запущено на 4 секунди.
Таймер C запущено на 8 секунд.
Таймер B завершено.
Таймер A завершено.
Таймер C завершено.

 

Це простий приклад, що демонструє роботу з асинхронними завданнями та керуванням часом очікування з використанням async та await.

 

Останні статті

СЕО знають, що через штучний інтелект будуть звільнення, але всім брешуть — софтверні інвестори

Керівники компаній часто вводять в оману, розповідаючи, що штучний інтелект лише підвищить продуктивність і не…

06.06.2025

США оголосили нагороду в $10 млн за інформацію про українського хакера, який втік у Росію

Уряд США пропонує до $10 мільйонів за інформацію про місцезнаходження розробника шкідливого програмного забезпечення RedLine…

06.06.2025

Google запевняє, що оновлена модель Gemini Pro 2.5 стала краще працювати з кодом

Google оголосила про оновлення своєї LLM-моделі Gemini 2.5 Pro, яка, за твердженням компанії, стала краще…

06.06.2025

CEO Google обіцяє збільшувати штат програмістів, незважаючи на штучний інтелект

Сундар Пічаї, який очолює Google з 2015 року, заявив, що його компанія продовжуватиме збільшувати число…

05.06.2025

«Ринок переповнений пропозиціями з України». Чому українські провайдери здають в оренду власні IPv4-адреси

Українські телекомунікаційні компанії та провайдери масово здають в оренду IPv4-адреси, які свого часу були виділені…

05.06.2025

ChatGPT отримав доступ до хмарних документів та сторонніх дослідницьких інструментів

У ChatGPT додали конектори для підключення до хмарних сервісів, таких як Google Drive, Box, Dropbox,…

05.06.2025