8.1 Основні особливості класу Future
Клас Future
у модулі asyncio
представляє собою
результат асинхронної операції, який буде доступний в майбутньому.
Об'єкти Future
використовуються для управління станом та результатами
асинхронних завдань.
Основні особливості класу Future
Об'єкт Future
є контейнером для результату, який буде
доступний пізніше, коли завдання закінчить виконуватись. Він надає
інтерфейс для отримання результату чи винятку, які будуть
встановлені після завершення асинхронної операції.
Створення і управління об'єктами Future
-
Створення: Зазвичай створюється з використанням
loop.create_future()
. -
Встановлення результату: Результат встановлюється
за допомогою методу
set_result(result)
. -
Встановлення винятку: Виняток
встановлюється за допомогою методу
set_exception(exception)
.
Основні методи та атрибути
set_result(result):
Встановлює результат для об'єкта Future
. Усі корутини, що очікують
цей об'єкт, будуть негайно відновлені з цим результатом.
set_exception(exception):
Встановлює виняток для об'єкта Future
. Усі корутини, що очікують
цей об'єкт, будуть негайно відновлені з цим винятком.
result():
Повертає результат об'єкта Future
, якщо він доступний. Якщо операція
завершилася з винятком, викличе цей виняток.
exception():
Повертає виняток, якщо він був встановлений, або None
, якщо
об'єкт Future
ще не завершений або завершений успішно.
done():
Повертає True
, якщо об'єкт Future
завершений (з результатом або
винятком).
add_done_callback(callback):
Додає зворотний виклик, який буде викликано при завершенні
об'єкта Future
.
8.2 Приклади використання
Встановлення та отримання результату
import asyncio
async def set_future_result(fut, delay):
await asyncio.sleep(delay)
fut.set_result("Результат Future готовий")
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_result(fut, 2))
result = await fut
print(result)
asyncio.run(main())
Обробка винятків
import asyncio
async def set_future_exception(fut, delay):
await asyncio.sleep(delay)
fut.set_exception(ValueError("Сталася помилка"))
async def main():
loop = asyncio.get_running_loop()
fut = loop.create_future()
asyncio.create_task(set_future_exception(fut, 2))
try:
result = await fut
except ValueError as e:
print(f"Спіймано виняток: {e}")
asyncio.run(main())
Взаємодія із завданнями
Часто об'єкти Future
використовуються в зв'язці із завданнями (Tasks)
. Коли
завдання створюється за допомогою asyncio.create_task()
, воно автоматично
створює об'єкт Future
, який можна використовувати для відстеження і
управління станом завдання.
import asyncio
async def example_coroutine():
await asyncio.sleep(1)
return "Результат завдання"
async def main():
task = asyncio.create_task(example_coroutine())
print(await task)
asyncio.run(main())
8.3 Переваги та особливості
Об'єкти Future
дозволяють керувати результатами і винятками
асинхронних операцій, забезпечуючи гнучкість і контроль над
виконанням. Future
можна використовувати в різних сценаріях
асинхронного програмування, включаючи завдання, таймери, зворотні
виклики та багато іншого.
Часто об'єкти Future
використовуються в зв'язці із завданнями (Tasks)
. Цей підхід дозволяє отримати вищий рівень контролю над виконанням і станом асинхронних операцій.
Обмеження
В деяких випадках використання Future
може бути більш складним у
порівнянні з використанням більш високорівневих абстракцій, таких
як завдання (Tasks)
або корутини. При використанні Future
може
знадобитися більше ручного управління станом і результатами
асинхронних операцій.