Ключові слова 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.
Favbet Tech – це ІТ-компанія зі 100% украінською ДНК, що створює досконалі сервіси для iGaming і Betting з використанням передових технологіи та надає доступ до них. Favbet Tech розробляє інноваційне програмне забезпечення через складну багатокомпонентну платформу, яка здатна витримувати величезні навантаження та створювати унікальний досвід для гравців.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: