No description
Find a file
2026-09-01 13:07:06 +02:00
.woodpecker chore: migrate CI to .woodpecker/{push,branch}.yml 2026-09-01 13:07:06 +02:00
src initial content 2026-09-01 13:07:03 +02:00
tests initial content 2026-09-01 13:07:03 +02:00
.gitignore Initial commit 2026-09-01 11:06:40 +00:00
Cargo.lock initial content 2026-09-01 13:07:03 +02:00
Cargo.toml chore: declare MSRV 1.85 (edition 2024) 2026-09-01 13:07:06 +02:00
LICENSE chore: add AGPL-3.0 license and standard .gitignore 2026-09-01 13:07:06 +02:00
README.md initial content 2026-09-01 13:07:03 +02:00

Lição 45: Async/Await Básico (Motor Assíncrono)

1. Narrativa

O mecha Æther possui um motor assíncrono que pode processar múltiplas tarefas sem bloquear o sistema principal. Em vez de esperar cada sensor responder sequencialmente, o motor assíncrono envia requisições e continua trabalhando enquanto aguarda. Quando a resposta chega, o motor retoma o processamento. É como um piloto que monitora vários painéis ao mesmo tempo.

2. Conceito

Async/Await é o modelo de programação assíncrona do Rust:

  • async fn: Declara uma função que retorna um Future
  • .await: Pausa a execução até o Future completar (sem bloquear a thread)
  • Future: Trait que representa um valor que estará disponível no futuro
  • Executores: Bibliotecas que executam futures (tokio, async-std)
  • Sem executor: Futures não fazem nada até serem executados (lazy como iterators)

3. Requisitos

  • Criar funções async básicas
  • Usar .await para esperar resultados
  • Simular operações assíncronas sem executor externo
  • Demonstrar o conceito de Future

4. Design de Dados

graph LR
    A[async fn] --> B[Future]
    B --> C[.await]
    C --> D[Resultado]
    E[Executor] --> B

5. Diagrama de Fluxo

flowchart TD
    A[Chamar async fn] --> B[Retorna Future]
    B --> C[.await]
    C --> D{Completo?}
    D -->|Sim| E[Retorna valor]
    D -->|Não| F[Cede controle]
    F --> G[Outra tarefa executa]
    G --> C

6. Funções

Função Descrição
duplicar_async Dobra valor em função async
somar_async Soma dois valores via async
filtrar_async Filtra vec com lógica async simulada
encadear_futures Encadeia transformações async
coletar_async Coleta resultados de múltiplos futures
timeout_simulado Simula operação com timeout
processar_pipeline Pipeline de processamento async
validar_dados Valida dados com verificações async

7. Exemplo

async fn dobrar(valor: i32) -> i32 {
    valor * 2
}

async fn processar() {
    let resultado = dobrar(5).await;
    assert_eq!(resultado, 10);
}

8. Missão

  1. Implementar duplicar_async usando async fn
  2. Implementar somar_async somando dois valores async
  3. Implementar filtrar_async filtrando vec via async
  4. Implementar encadear_futures encadeando .await em sequência
  5. Implementar coletar_async coletando resultados de múltiplos futures
  6. Implementar timeout_simulado simulando espera assíncrona
  7. Implementar processar_pipeline com pipeline de transformações
  8. Implementar validar_dados com validações async encadeadas

9. Como Executar

cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check

10. Dicas

  • async fn transforma o retorno T em impl Future<Output = T>
  • .await só pode ser usado dentro de funções async
  • Futures são lazy — nada acontece até .await ou poll
  • Sem um executor de verdade, faça polling manual: crie um Waker no-op com RawWaker/RawWakerVTable, monte um Context a partir dele e chame future.poll(&mut cx) em loop até receber Poll::Ready (veja o block_on caseiro em tests/integracao.rs)
  • async move captura ownership das variáveis do ambiente