tokio (1.54.1)
Vue d'ensemble
Cette compétence contient ce que la documentation officielle de tokio indique comme étant facile à mal comprendre : la sécurité d'annulation, le blocage du runtime, les valeurs par défaut surprenantes, les paniques et les API qui remplacent les anciennes. Les bases que tout développeur async Rust connaît sont omises. Chaque affirmation dans references/ se termine par l'URL de la documentation dont elle provient, afin que vous puissiez rouvrir la page. https://docs.rs/tokio/latest/tokio/index.html
Version couverte
tokio 1.54.1, tel que servi par docs.rs/tokio/latest, plus les pages du tutoriel et des sujets tokio.rs. Les API instables nécessitent --cfg tokio_unstable et peuvent casser en 1.x, donc ne les suggérez pas sauf si le projet les active déjà. https://docs.rs/tokio/latest/tokio/index.html#unstable-features
Comment naviguer
- Trouvez le domaine du code que vous écrivez ou révisez dans le tableau ci-dessous.
- Ouvrez uniquement ce fichier de référence. Chacun est autonome, avec une table des matières en haut.
- Appliquez sa règle par défaut. N'utilisez l'échappatoire que si la condition énoncée est remplie.
- Lors d'une relecture, vérifiez également le tableau « Anciens motifs » à la fin du fichier, s'il y en a un, et suggérez le remplacement.
- Dans votre réponse, donnez l'URL de la documentation qui suit chaque règle que vous appliquez, afin que le lecteur puisse la vérifier.
Règles à plus forte valeur
- Un runtime construit avec
Buildern'a pas de pilote d'E/S ni de temporisateur. Appelezenable_all(), sinon les types de réseau et de temps échouent. https://docs.rs/tokio/latest/tokio/runtime/index.html#resource-drivers #[tokio::test]s'exécute sur un runtime à thread courant,#[tokio::main]sur un runtime multi-thread.#[tokio::main]sur une fonction appelée fréquemment construit un nouveau runtime par appel. https://docs.rs/tokio/latest/tokio/attr.test.html et https://docs.rs/tokio/latest/tokio/attr.main.htmlrt.block_on(sleep(d))panique : le futur est créé en dehors du runtime. Enveloppez-le :rt.block_on(async { sleep(d).await }). https://docs.rs/tokio/latest/tokio/time/fn.sleep.html- Sur un runtime à thread courant, les tâches lancées s'exécutent uniquement pendant que
Runtime::block_onest en cours.Handle::block_onne l'entraîne pas. https://docs.rs/tokio/latest/tokio/runtime/index.html#driving-the-runtime - Par défaut, utilisez
std::sync::Mutexdans le code async, sans jamais le maintenir à travers un.await. Terminez le verrou dans un bloc, cardrop(guard)ne satisfait pas la vérificationSend. Utiliseztokio::sync::Mutexuniquement lorsque le verrou doit traverser un.await. https://tokio.rs/tokio/tutorial/shared-state - Exécutez le code bloquant ou gourmand en CPU avec
spawn_blocking, et une boucle infinie sur unstd::thread.abortn'arrête pas une tâche bloquante en cours. https://docs.rs/tokio/latest/tokio/task/fn.spawn_blocking.html - Dans
select!, les branches perdantes sont abandonnées.read_exact,read_to_end,write_alletmpsc::Sender::sendy perdent des données. Utilisezreserve()pour les envois, et épinglez les futurs de longue durée en dehors de la boucle et sélectionnez sur&mut fut. https://docs.rs/tokio/latest/tokio/macro.select.html et https://docs.rs/tokio/latest/tokio/sync/mpsc/struct.Sender.html#method.send select!panique lorsque chaque branche est désactivée et qu'il n'y a pas deelse. https://docs.rs/tokio/latest/tokio/macro.select.html- Préférez
mpsc::channel(n)bornée pour la contre-pression.recvne retourneNonequ'une fois que tous lesSendersont abandonnés. https://tokio.rs/tokio/tutorial/channels et https://docs.rs/tokio/latest/tokio/sync/mpsc/index.html - Un récepteur broadcast lent reçoit
RecvError::Lagged(n)et reste ouvert. Gérez-le au lieu de traiter chaque erreur comme une fermeture. https://docs.rs/tokio/latest/tokio/sync/broadcast/struct.Receiver.html#method.recv - Dans une boucle
changed()de watch, utilisezborrow_and_update(), et ne maintenez jamaisborrow()à travers un.await. https://docs.rs/tokio/latest/tokio/sync/watch/index.html - Abandonner un
JoinHandledétache la tâche. Abandonner unJoinSetannule toutes ses tâches. https://docs.rs/tokio/latest/tokio/task/struct.JoinSet.html intervaltique immédiatement la première fois et, par défaut, émet des tiques manqués en rafale. DéfinissezMissedTickBehavior::DelayouSkiplorsque les rafales de rattrapage ne sont pas appropriées. https://docs.rs/tokio/latest/tokio/time/enum.MissedTickBehavior.htmltimeoutinterroge le futur avant de vérifier l'échéance, donc un futur qui ne cède jamais la main peut se terminer après l'échéance avecOk. https://docs.rs/tokio/latest/tokio/time/fn.timeout.html- Testez les temporisateurs avec
#[tokio::test(start_paused = true)](fonctionnalitétest-util) etsleepavec avancement automatique plutôt qu'avecadvance. https://docs.rs/tokio/latest/tokio/time/fn.advance.html - Videz un
BufWriteret untokio::fs::Fileavant l'abandon, sinon les données sont perdues ou écrites tardivement. https://docs.rs/tokio/latest/tokio/io/index.html et https://docs.rs/tokio/latest/tokio/fs/struct.File.html - Un
read()retournantOk(0)signifie fermé. Une boucle qui l'ignore tourne à 100 % du CPU. https://tokio.rs/tokio/tutorial/io - Chaque appel à
tokio::fsest unspawn_blocking. Regroupez-les avecfs::read/fs::writeouBufWriter. https://docs.rs/tokio/latest/tokio/fs/index.html - Un
Childabandonné continue de s'exécuter sauf sikill_on_drop(true)est défini.output()force la redirection de stdout et stderr. https://docs.rs/tokio/latest/tokio/process/index.html et https://docs.rs/tokio/latest/tokio/process/struct.Command.html#method.output - Sous Unix, le premier écouteur
ctrl_c()remplace définitivement le gestionnaire SIGINT par défaut. https://docs.rs/tokio/latest/tokio/signal/fn.ctrl_c.html - Un serveur de tube nommé doit créer l'instance suivante avant de remettre l'instance connectée, sinon les clients reçoivent
NotFound. Un client ne réessaie qu'en cas deERROR_PIPE_BUSY.NotFoundsignifie qu'aucun serveur n'existe, donc retournez l'erreur plutôt que de réessayer. https://docs.rs/tokio/latest/tokio/net/windows/named_pipe/struct.NamedPipeServer.html et https://docs.rs/tokio/latest/tokio/net/windows/named_pipe/struct.NamedPipeClient.html
Références
| Fichier | Couvre |
|---|---|
| references/runtime.md | Indicateurs de fonctionnalité, Builder et pilotes, LocalRuntime, shutdown, #[tokio::main] et #[tokio::test] |
| references/block-on-bridging.md | Entraîner un runtime, block_on et Handle::block_on, EnterGuard et Handle::current, appeler du code async depuis du code synchrone, fork Unix |
| references/tasks.md | spawn et ses limites, JoinHandle, abort, JoinSet, spawn_blocking, block_in_place, budget coop, LocalSet, spawn_local, task_local |
| references/sync-locks.md | Mutex std vs tokio, verrous à travers .await, RwLock, Semaphore, Notify, OnceCell, SetOnce, Barrier |
| references/channels.md | Contre-pression mpsc, permis et fermeture, oneshot, retard broadcast, règles d'emprunt watch |
| references/select-cancellation.md | Règles de select!, listes de sécurité d'annulation, épinglage à travers les boucles, biased, join!, try_join!, arrêt gracieux |
| references/time-testing.md | sleep, interval et MissedTickBehavior, timeout, Instant, temps suspendu, simulation d'E/S dans les tests |
| references/io-net.md | Traits d'extension AsyncRead/AsyncWrite, BufWriter, split, io::copy, framing, TcpListener, TcpStream, TcpSocket, UdpSocket |
| references/fs-process.md | tokio::fs et son pool bloquant, vidage et abandon de File, Command, Child, kill_on_drop, tubes stdio |
| references/signals-named-pipes.md | ctrl_c, signaux Unix, événements console Windows, serveur et client de tube nommé Windows |
Toutes les pages lues sont listées dans SOURCES.md.