Объект asyncio future в Python на примерах

В этом уроке вы узнаете об объектах asyncio future в Python  и поймете, как они работают.

Содержание

Что такое asyncio future в Python?

future — это объект, который возвращает значение позже в будущем, но не сейчас. Обычно такой объект является результатом асинхронной операции.

Например, вы можете вызвать API с удаленного сервера и ожидать получения результата позже. Вызов API может вернуть будущий объект, чтобы вы могли его дождаться.

Чтобы создать объект future, используйте класс Future из модуля asyncio. Рассмотрим следующий пример:

import asyncio
from asyncio import Future


async def main():
    my_future = Future()
    print(my_future.done())  # False

    my_future.set_result('Bright')

    print(my_future.done())  # True

    print(my_future.result())


asyncio.run(main())

Как это работает.

  • Сначала импортируйте класс Future из библиотеки asyncio:
from asyncio import Future
  • Затем создайте новый объект Future в сопрограмме main():
my_future = Future()

Вновь созданный объект future не имеет никакой ценности, поскольку он еще не существует. В этом состоянии future считается незавершенным, нерешенным или незавершенным.

  • Затем вызовите метод Done(), чтобы проверить статус будущего объекта:
print(my_future.done())  # False

Он возвращает False.

  • После этого задайте значение для объекта future, вызвав метод set_result():
my_future.set_result('Bright')
  • Как только вы установите значение, future уже сделан. Вызов метода Done() будущего объекта на этом этапе возвращает True:
print(my_future.done())  # True
  • Наконец, получите результат от объекта future, вызвав его метод result():
print(my_future.result())

Использование asyncio future с ожиданием в Python

Когда вы используете ключевое слово await с future, вы приостанавливаете future, пока оно не вернет значение. В следующем примере показано, как использовать будущее время с ключевым словом await:

from asyncio import Future
import asyncio


async def plan(my_future):
    print('Planning my future...')
    await asyncio.sleep(1)
    my_future.set_result('Bright')


def create() -> Future:
    my_future = Future()
    asyncio.create_task(plan(my_future))
    return my_future


async def main():
    my_future = create()
    result = await my_future

    print(result)


asyncio.run(main())

Выход:

Planning my future...
Bright

Как это работает.

  • Сначала определите сопрограмму, которая принимает future и устанавливает его значение через 1 секунду:
async def plan(my_future: Future):
    print('Planning my future...')
    await asyncio.sleep(1)
    my_future.set_result('Bright')
  • Во-вторых, определите функцию create(), которая планирует сопрограмму plan() как задачу и возвращает будущий объект:
def create() -> Future:
    my_future = Future()
    asyncio.create_task(plan(my_future))
    return my_future
  • В-третьих, вызовите функцию create(), которая возвращает future, используйте ключевое слово await, чтобы дождаться, пока future вернет результат, и отобразите его:
async def main():
    my_future = create()
    result = await my_future

    print(result)

На практике вам редко придется создавать объекты Future напрямую. Однако вы будете использовать объекты Future, возвращаемые из API. Поэтому важно понимать, как работает future.

Coroutine, Future и Task

Следующая иерархия классов показывает отношения между Coroutine, Future и Task:

Пример соотношения Coroutine, Future и Task

В этой иерархии классов Courtine, Future и Task являются подклассами абстрактного класса Awaitable.

Класс Awaitable имеет абстрактный метод __await__(). Любой класс, реализующий метод __await__(), можно использовать с ключевым словом await. А объекты классов, которые можно использовать с ключевым словом await, называются awaitables.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *