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 може знадобитися більше ручного управління станом і результатами асинхронних операцій.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ