Resumo : neste tutorial, você aprenderá sobre asyncio
objetos futuros do Python e entenderá como eles funcionam.
Introdução ao futuro assíncrono do Python
Um futuro é um objeto que retorna um valor mais tarde no futuro, mas não agora. Normalmente, um objeto futuro é o resultado de uma operação assíncrona.
Por exemplo, você pode chamar uma API de um servidor remoto e esperar receber o resultado mais tarde. A chamada da API pode retornar um objeto futuro para que você possa aguardá-lo.
Para criar um objeto futuro, você usa a Future
classe do asyncio
pacote. Considere o seguinte exemplo:
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())
Linguagem de código: Python ( python )
Como funciona.
Primeiro, importe Future
a classe da asyncio
biblioteca:
from asyncio import Future
Linguagem de código: Python ( python )
A seguir, crie um novo Future
objeto na main()
corrotina:
my_future = Future()
Linguagem de código: Python ( python )
Um futuro recém-criado não tem valor porque ainda não existe. Neste estado, o futuro é considerado incompleto, não resolvido ou não realizado.
Em seguida, chame o done()
método para verificar o status do objeto futuro:
print(my_future.done()) # False
Linguagem de código: Python ( python )
Ele retorna False
.
Depois disso, defina um valor para o objeto futuro chamando o set_result()
método:
my_future.set_result('Bright')
Linguagem de código: Python ( python )
Depois de definir o valor, o futuro estará feito. Chamar o done()
método do objeto futuro neste estágio retorna True
:
print(my_future.done()) # True
Linguagem de código: Python ( python )
Finalmente, obtenha o resultado do objeto futuro chamando seu result()
método:
print(my_future.result())
Linguagem de código: Python ( python )
Usando Python asyncio future com espera
Ao usar a await
palavra-chave com futuro, você pausa o futuro até que ele retorne um valor. O exemplo a seguir mostra como usar a await
palavra-chave future with:
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())
Linguagem de código: Python ( python )
Saída:
Planning my future...
Bright
Linguagem de código: Python ( python )
Como funciona.
Primeiro, defina uma corrotina que aceite um futuro e defina seu valor após 1 segundo:
async def plan(my_future: Future):
print('Planning my future...')
await asyncio.sleep(1)
my_future.set_result('Bright')
Linguagem de código: Python ( python )
Segundo, defina uma create()
função que agende a plan()
corrotina como uma tarefa e retorne um objeto futuro:
def create() -> Future:
my_future = Future()
asyncio.create_task(plan(my_future))
return my_future
Linguagem de código: Python ( python )
Terceiro, chame a create()
função que retorna um futuro, use a palavra-chave wait para esperar que o futuro retorne um resultado e exiba-o:
async def main():
my_future = create()
result = await my_future
print(result)
Linguagem de código: Python ( python )
Na prática, raramente você precisará criar Future
objetos diretamente. No entanto, você usará os Future
objetos retornados da API. Portanto, é importante entender como Future
funciona.
Futuros, tarefas e corrotinas
A hierarquia de classes a seguir mostra os relacionamentos entre Coroutine , Future e Task :
Nesta hierarquia de classes, Courtine, Future e Task são subclasses da classe abstrata Awaitable.
A Awaitable
classe possui um método abstrato
. Qualquer classe que possua a implementação do __await__()
método pode ser usada com a palavra-chave await. E os objetos de classes que podem ser usados com a __await__()
await
palavra-chave são chamados de awaitables .
Resumo
- Um futuro é um objeto que retorna um valor no futuro, não agora.
Future
,Coroutine
, eTask
são aguardáveis e seus objetos podem ser usados com aawait
palavra-chave.