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 може знадобитися більше ручного управління станом і результатами асинхронних операцій.