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

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

 

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

Більше 8 млрд грн податків. Стільки сплатили резиденти Дія.City в І кварталі 2025 року

Резиденти Дія.City сплатили до бюджету понад 8 млрд грн податків в І кварталі 2025 року.…

18.04.2025

Китайських офісних працівників закликають менше працювати. Це має допомогти місцевій економіці

У Китаї закликають офісних працівників не працювати надто багато — держава сподівається, що вільний час…

18.04.2025

ChatGPT значно покращив пошук місць по фото. Це посилює проблеми конфіденційності

Експерти звертають увагу на тривожну тенденцію: люди все частіше використовують ChatGPT, щоб визначити місцезнаходження, зображене…

18.04.2025

Середовище розробки IntelliJ IDEA оновлено до версії 2025.1

Компанія JetBrains випустила нову версію мультимовного середовища розробки IntelliJ IDEA 2025.1. Оновлена IDE отримала численні…

18.04.2025

Discord впроваджує функцію сканування обличчя для перевірки віку користувачів

Платформа обміну миттєвими повідомленнями Discord впроваджує функцію перевірки віку за допомогою сканування обличчя. Зараз вона…

18.04.2025

Wikipedia випустила спеціальний датасет, щоб відволікти увагу ботів

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

18.04.2025