No description
- Rust 100%
| .woodpecker | ||
| src | ||
| tests | ||
| .gitignore | ||
| Cargo.lock | ||
| Cargo.toml | ||
| LICENSE | ||
| README.md | ||
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 umFuture.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
asyncbásicas - Usar
.awaitpara 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
- Implementar
duplicar_asyncusandoasync fn - Implementar
somar_asyncsomando dois valores async - Implementar
filtrar_asyncfiltrando vec via async - Implementar
encadear_futuresencadeando.awaitem sequência - Implementar
coletar_asynccoletando resultados de múltiplos futures - Implementar
timeout_simuladosimulando espera assíncrona - Implementar
processar_pipelinecom pipeline de transformações - Implementar
validar_dadoscom validações async encadeadas
9. Como Executar
cargo build
cargo test
cargo clippy -- -D warnings
cargo fmt --check
10. Dicas
async fntransforma o retornoTemimpl Future<Output = T>.awaitsó pode ser usado dentro de funçõesasync- Futures são lazy — nada acontece até
.awaitou poll - Sem um executor de verdade, faça polling manual: crie um
Wakerno-op comRawWaker/RawWakerVTable, monte umContexta partir dele e chamefuture.poll(&mut cx)em loop até receberPoll::Ready(veja oblock_oncaseiro emtests/integracao.rs) async movecaptura ownership das variáveis do ambiente