Futures e Tasks
Definição
Futures e Tasks são abstrações que representam valores ou resultados que estarão disponíveis no futuro, geralmente como resultado de uma operação assíncrona.
- Um Future é um placeholder para um valor futuro, que ainda não foi calculado.
- Uma Task é a unidade de execução assíncrona, que realiza um trabalho e atualiza o Future com o resultado.
Em muitas linguagens, as Tasks são consideradas um tipo especial de Future, pois representam uma computação em andamento que pode ser aguardada (await
, .get()
, etc.).
Objetivos de Futures e Tasks
- Representar operações em progresso de forma rastreável.
- Permitir aguardar resultados assíncronos com controle explícito.
- Gerenciar execuções paralelas, com cancelamento, timeout ou coleta de resultados.
- Unificar o tratamento de operações assíncronas em APIs consistentes.
Exemplo prático (Python)
import asyncio
async def tarefa_lenta():
await asyncio.sleep(1)
return "resultado"
async def main():
# cria uma Task a partir de uma coroutine
task = asyncio.create_task(tarefa_lenta())
print("Tarefa iniciada, aguardando resultado...")
resultado = await task
print("Resultado:", resultado)
asyncio.run(main())
Saída esperada
Tarefa iniciada, aguardando resultado...
Resultado: resultado
A função
tarefa_lenta
retorna um Future.O método
create_task()
transforma a coroutine em uma Task agendada no event loop.Usamos
await
para aguardar o término da Task.
Estados de uma Future/Task
[Pending] → [Running] → [Done]
↘︎ [Cancelled] ou [Exception]
Pending
: a tarefa foi criada mas ainda não começou.
Running
: está em execução.
Done
: foi concluída com sucesso.
Pode também ser cancelada ou terminar com erro.
Comparativo entre linguagens
Linguagem | Future/Task | Espera com |
---|---|---|
Python | asyncio.Future , asyncio.Task |
await |
Java | Future<T> , CompletableFuture<T> |
.get() , .thenApply() |
C# | Task , Task<T> |
await |
Rust | Future trait |
.await |
JavaScript | Promise |
.then() , await |
Diferença entre Future e Task
Conceito | Future | Task |
---|---|---|
Representa | Resultado futuro (valor pendente) | Execução de uma coroutine ou função |
Estado | Pode ser preenchido externamente | Controlado pelo runtime |
Exemplo (Python) | future = loop.create_future() |
task = asyncio.create_task(coro()) |
ℹ️ Em Python, uma Task envolve agendamento real no event loop, enquanto um Future pode ser controlado manualmente (ex: para testes ou integração com outras APIs).