tokio (1.54.1)
Visão Geral
Este skill contém o que a documentação oficial do Tokio diz que é fácil de errar: segurança de cancelamento, bloqueio do runtime, padrões surpreendentes, panics e as APIs que substituem as antigas. Os fundamentos que todo desenvolvedor Rust assíncrono conhece foram omitidos. Cada afirmação em references/ termina com a URL da documentação de onde veio, para que você possa reabrir a página. https://docs.rs/tokio/latest/tokio/index.html
Versão Coberta
tokio 1.54.1, conforme servido por docs.rs/tokio/latest, além do tutorial e páginas de tópicos do tokio.rs. APIs instáveis precisam de --cfg tokio_unstable e podem quebrar na versão 1.x, portanto, não as sugira a menos que o projeto já as habilite. https://docs.rs/tokio/latest/tokio/index.html#unstable-features
Como Navegar
- Encontre o domínio do código que você está escrevendo ou revisando na tabela abaixo.
- Abra apenas o arquivo de referência correspondente. Cada um é independente, com uma tabela de conteúdos no topo.
- Aplique suas regras padrão. Use a saída de escape somente quando a condição declarada for verdadeira.
- Em uma revisão, verifique também a tabela "Padrões antigos" no final do arquivo, quando houver, e sugira a substituição.
- Na sua resposta, forneça a URL da documentação que segue cada regra que você aplicar, para que o leitor possa verificá-la.
Regras de Maior Valor
- Um runtime construído com
Buildernão possui drivers de E/S ou temporizador. Chameenable_all(), ou os tipos de rede e tempo falharão. https://docs.rs/tokio/latest/tokio/runtime/index.html#resource-drivers #[tokio::test]executa em um runtime de thread única,#[tokio::main]em um multi-thread.#[tokio::main]em uma função chamada com frequência constrói um novo runtime por chamada. https://docs.rs/tokio/latest/tokio/attr.test.html e https://docs.rs/tokio/latest/tokio/attr.main.htmlrt.block_on(sleep(d))causa pânico: o future é criado fora do runtime. Encapsule-o:rt.block_on(async { sleep(d).await }). https://docs.rs/tokio/latest/tokio/time/fn.sleep.html- Em um runtime de thread única, as tarefas spawnadas são executadas apenas enquanto
Runtime::block_onestiver em execução.Handle::block_onnão as impulsiona. https://docs.rs/tokio/latest/tokio/runtime/index.html#driving-the-runtime - Por padrão, use
std::sync::Mutexem código assíncrono, nunca mantido através de um.await. Encerre o guard em um escopo de bloco, já quedrop(guard)não satisfaz a verificação deSend. Usetokio::sync::Mutexapenas quando o guard precisar cruzar um.await. https://tokio.rs/tokio/tutorial/shared-state - Execute código bloqueante ou pesado em CPU com
spawn_blocking, e loops infinitos em umastd::thread.abortnão para uma tarefa bloqueante em execução. https://docs.rs/tokio/latest/tokio/task/fn.spawn_blocking.html - Em
select!, as branches perdedoras são descartadas.read_exact,read_to_end,write_allempsc::Sender::sendperdem dados ali. Usereserve()para envios, e fixe futures de longa duração fora do loop e selecione em&mut fut. https://docs.rs/tokio/latest/tokio/macro.select.html e https://docs.rs/tokio/latest/tokio/sync/mpsc/struct.Sender.html#method.send select!causa pânico quando todas as branches estão desabilitadas e não háelse. https://docs.rs/tokio/latest/tokio/macro.select.html- Prefira um
mpsc::channel(n)limitado para contrapressão.recvretornaNoneapenas quando todos osSenderforem descartados. https://tokio.rs/tokio/tutorial/channels e https://docs.rs/tokio/latest/tokio/sync/mpsc/index.html - Um receptor broadcast lento obtém
RecvError::Lagged(n)e permanece aberto. Trate isso em vez de tratar todo erro como fechamento. https://docs.rs/tokio/latest/tokio/sync/broadcast/struct.Receiver.html#method.recv - Em um loop
changed()de watch, useborrow_and_update(), e nunca mantenha umborrow()através de.await. https://docs.rs/tokio/latest/tokio/sync/watch/index.html - Descartar um
JoinHandledesanexa a tarefa. Descartar umJoinSetaborta todas as suas tarefas. https://docs.rs/tokio/latest/tokio/task/struct.JoinSet.html intervaldispara imediatamente na primeira vez e, por padrão, acumula ticks perdidos. DefinaMissedTickBehavior::DelayouSkipquando rajadas de recuperação forem inadequadas. https://docs.rs/tokio/latest/tokio/time/enum.MissedTickBehavior.htmltimeoutavalia o future antes de verificar o prazo, portanto, um future que nunca cede pode terminar após o prazo comOk. https://docs.rs/tokio/latest/tokio/time/fn.timeout.html- Teste temporizadores com
#[tokio::test(start_paused = true)](featuretest-util) esleepcom avanço automático em vez deadvance. https://docs.rs/tokio/latest/tokio/time/fn.advance.html - Descarregue um
BufWritere umtokio::fs::Fileantes do drop, ou os dados serão perdidos ou escritos tardiamente. https://docs.rs/tokio/latest/tokio/io/index.html e https://docs.rs/tokio/latest/tokio/fs/struct.File.html - Um
read()retornandoOk(0)significa fechado. Um loop que o ignora gira a 100% de CPU. https://tokio.rs/tokio/tutorial/io - Cada chamada
tokio::fsé umspawn_blocking. Agrupe comfs::read/fs::writeouBufWriter. https://docs.rs/tokio/latest/tokio/fs/index.html - Um
Childdescartado continua em execução a menos quekill_on_drop(true).output()força stdout e stderr canalizados. https://docs.rs/tokio/latest/tokio/process/index.html e https://docs.rs/tokio/latest/tokio/process/struct.Command.html#method.output - No Unix, o primeiro listener
ctrl_c()substitui o manipulador padrão de SIGINT permanentemente. https://docs.rs/tokio/latest/tokio/signal/fn.ctrl_c.html - Um servidor de pipe nomeado deve criar a próxima instância antes de entregar a instância conectada, ou os clientes recebem
NotFound. Um cliente tenta novamente apenas emERROR_PIPE_BUSY.NotFoundsignifica que não há servidor, portanto, retorne o erro em vez de tentar novamente. https://docs.rs/tokio/latest/tokio/net/windows/named_pipe/struct.NamedPipeServer.html e https://docs.rs/tokio/latest/tokio/net/windows/named_pipe/struct.NamedPipeClient.html
Referências
| Arquivo | Cobre |
|---|---|
| references/runtime.md | Feature flags, Builder e drivers, LocalRuntime, shutdown, #[tokio::main] e #[tokio::test] |
| references/block-on-bridging.md | Impulsionando um runtime, block_on e Handle::block_on, EnterGuard e Handle::current, chamando código assíncrono de código síncrono, fork Unix |
| references/tasks.md | spawn e seus limites, JoinHandle, abort, JoinSet, spawn_blocking, block_in_place, orçamento cooperativo, LocalSet, spawn_local, task_local |
| references/sync-locks.md | Mutex std vs tokio, guards através de .await, RwLock, Semaphore, Notify, OnceCell, SetOnce, Barrier |
| references/channels.md | Contrapressão mpsc, permits e fechamento, oneshot, lag broadcast, regras de borrow em watch |
| references/select-cancellation.md | Regras de select!, listas de segurança de cancelamento, fixação através de loops, biased, join!, try_join!, encerramento gracioso |
| references/time-testing.md | sleep, interval e MissedTickBehavior, timeout, Instant, tempo pausado, simulação de E/S em testes |
| references/io-net.md | Traits ext AsyncRead/AsyncWrite, BufWriter, split, io::copy, framing, TcpListener, TcpStream, TcpSocket, UdpSocket |
| references/fs-process.md | tokio::fs e seu pool bloqueante, File flush e drop, Command, Child, kill_on_drop, pipes stdio |
| references/signals-named-pipes.md | ctrl_c, sinais Unix, eventos de console Windows, servidor e cliente de pipe nomeado Windows |
Todas as páginas lidas estão listadas em SOURCES.md.