Объект asyncio future в Python на примерах
В этом уроке вы узнаете об объектах asyncio future в Python и поймете, как они работают.
- Что такое asyncio future в Python?
- Использование asyncio future с ожиданием в Python
- Coroutine, Future и Task
Что такое 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:
В этой иерархии классов Courtine, Future и Task являются подклассами абстрактного класса Awaitable.
Класс Awaitable имеет абстрактный метод __await__(). Любой класс, реализующий метод __await__(), можно использовать с ключевым словом await. А объекты классов, которые можно использовать с ключевым словом await, называются awaitables.