Tokio (logiciel)

Tokio

Informations
Créateur Carl Lerche
Première version [1] et [2]
Dernière version 1.47.1 ()[3]
Dépôt github.com/tokio-rs/tokio
Écrit en Rust
Système d'exploitation macOS, Windows, Linux, FreeBSD, WebAssembly
Type Bibliothèque d'exécution (en)
Rust library (d)
Licence Licence MIT
Documentation tokio.rs/tokio/tutorial
Site web tokio.rs

Tokio est une bibliothèque logicielle pour le langage de programmation Rust. Il fournit un environnement d'exécution et des fonctions qui permettent l'utilisation d'I/O asynchrones (en), permettant la concurrence en ce qui concerne l'achèvement des tâches[4],[5],[6].

Tokio est sorti en août 2016 pour Rust, un langage de programmation à usage général. Développé par Carl Lerche, Tokio a commencé comme un framework d'application réseau et prend en charge des fonctionnalités telles que l'écoute et le broadcast de socket, permettant le transfert de messages entre ordinateurs.

Histoire

Tokio a débuté en août 2016 par Carl Lerche en tant que framework d'application réseau pour Rust construit sur des futures, permettant un middleware basé sur le réseau et une implémentation I/O non-bloquante (en), ou asynchrone, de l'intérêt de préparation du réacteur. Tokio s'est inspiré de Finagle, un système d'appel de procédure à distance asynchrone (RPC) basé sur Scala développé par Twitter pour les machines virtuelles Java (JVM) et permettant aux systèmes distribués de communiquer au sein d'une JVM. Tokio utilise la bibliothèque Rust de niveau inférieur mio, utilisant elle-même des appels système tels que epoll (en) (Linux), kqueue (en) (FreeBSD) et l'API du port d'achèvement d'entrée/sortie (en) (IOCP) (Windows). Pour Linux, il peut également utiliser io_uring (en) via tokio-uring[7],[8],[9]. Le nom « Tokio » est dérivé de Tokyo et mio[10]. La version préliminaire de Tokio est sortie en janvier 2017[11], suivie d'une sortie complète en décembre 2020[12],[13]. En 2017, Tokio a reçu une subvention du fonds de soutien Open Source de Mozilla[14]. En avril 2021, Tokio a financé son premier contributeur rémunéré, Alice Ryhl, pour son travail de développement du projet et d'assistance à ses utilisateurs[15].

Bien que Rust prenne en charge les fonctions asynchrones depuis la version 1.39, publiée en novembre 2019[16], il ne fournit aucune fonctionnalité pour les exécuter, nécessitant un environnement d'exécution externe pour cet usage[17]. Tokio fournit un environnement d'exécution qui utilise un planificateur de vol de travail (en) multithread[12]. Les futurs de Rust sont évalués paresseusement, ce qui oblige les fonctions à appeler .await avant d'effectuer une tâche[18]. Lorsque .await est invoqué, l'environnement d'exécution de Tokio peut suspendre le futur d'origine jusqu'à ce que ses I/O soient terminées et réactiver une tâche différente qui est prête à être traitée[19].

Les utilisateurs de Tokio incluent les équipes de développement derrière Discord et AWS Lambda[12]. L'environnement d'exécution JavaScript et TypeScript Deno utilise Tokio en arrière-plan, contrairement à l'environnement d'exécution JavaScript Node.js, qui utilise la bibliothèque libuv (en)[20].

Caractéristiques

Code asynchrone

Tokio permet l'utilisation de fonctions asynchrones dans Rust via la création d'un environnement d'exécution asynchrone. Cela peut être réalisé via la macro #[tokio::main][19].

Par exemple:

#[tokio::main]
async fn main() -> Result<()> {
    let url = "https://en.wikipedia.org/";
    let text = reqwest::get(url).await?.text().await?;
    println!("{}", text);
    Ok(())
}

Dans cet exemple, la librairie reqwest est utilisée pour réclamer le code HTML de la page de Wikipédia en anglais. Pour garantir que la demande ne soit pas traitée immédiatement, Tokio encapsule l'appel de la fonction dans un environnement d'exécution asynchrone, attendant que la demande soit terminée avant d'appeler println().

Tokio inclut également une version de la bibliothèque standard Rust conçue pour être utilisée de manière asynchrone. Par exemple, tokio::fs::read_to_end(), qui lit le contenu d'un fichier, est la version asynchrone de std::fs::read_to_end()[21]. De plus, Tokio prend en charge io_uring (en), une interface d'appel système d'I/O asynchrone Linux, dans une librairie séparée nommée tokio-uring[12],[22].

Le modèle de coroutine

Tokio permet également aux utilisateurs de créer des tâches, qui sont des coroutines sans pile, à l'aide d'une fonction tokio::spawn(). Les tâches s'exécutent au niveau de l'utilisateur, offrant une concurrence même lorsqu'il n'y a qu'un seul thread[23].

Écoute de socket

Tokio est capable d'écouter sur une socket via une approche non-bloquante (en)[7]. En particulier, la structure TcpListener lie un auditeur de socket TCP (Transmission Control Protocol) à une adresse et exécute une fonction de manière asynchrone[24].

Broadcasting

Tokio fournit un type de canal broadcast, permettant de diffuser des messages à plusieurs récepteurs. Lors de l’envoi d’un message, celui-ci est reçu par ces récepteurs. Cela permet la communication en temps réel et les systèmes distribués, entre autres applications[25].

References

(en) Cet article est partiellement ou en totalité issu de l’article de Wikipédia en anglais intitulé « Tokio (software) » (voir la liste des auteurs).
  1. « https://tokio.rs/blog/2017-01-tokio-0-1 »
  2. « https://github.com/tokio-rs/tokio-core/releases/tag/0.1.0 »
  3. « Release 1.47.1 », (consulté le )
  4. (en) Abhishek Chanda, Network Programming with Rust : Build fast and resilient network servers and clients by leveraging Rust's memory-safety and concurrency features, Birmingham, Packt Publishing, (ISBN 978-1-78862-171-7, OCLC 1028194311, lire en ligne)
  5. (en) Rahul Sharma, Mastering Rust : learn about memory safety, type system, concurrency, and the new features of Rust 2018 edition, Birmingham, UK, Packt Publishing, (ISBN 978-1-78934-118-8, OCLC 1090681119, lire en ligne)
  6. (en) Sergio De Simone, « Rust Asynchronous Runtime Tokio Reaches 1.0 », sur https://www.infoq.com, (consulté le )
  7. (en) Carl Lerche, « Announcing Tokio », sur medium.com, (consulté le )
  8. (en) « Finagle: A Protocol-Agnostic RPC System », sur blog.x.com, (consulté le )
  9. (en) Guillaume Gomez et Antoni Boucher, Rust Programming By Example : Enter the World of Rust by Building Engaging, Concurrent, Reactive, and Robust Applications, Birmingham, Packt Publishing, (ISBN 9781788470308, lire en ligne)
  10. (en) Carl Lerche, « I enjoyed visiting Tokio (Tokyo) the city and I liked the "io" suffix and how it plays w/ Mio as well. I don't know... naming is hard so I didn't spend too much time thinking about it. », sur Reddit, (consulté le )
  11. (en) Carl Lerche, Alex Crichton et Aaron Turon, « Announcing Tokio 0.1 », sur tokio.rs, (consulté le )
  12. (en) Paul Krill, « Tokio Rust runtime reaches 1.0 status », sur InfoWorld, (consulté le )
  13. (en) Carl Lerche, « Announcing Tokio 1.0 », sur tokio.rs, (consulté le )
  14. (en) ris, « Mozilla Awards $365,000 to Open Source Projects as part of MOSS », sur lwn.net, (consulté le )
  15. (en) « Welcoming Alice Ryhl as the first paid Tokio contributor », sur tokio.rs, (consulté le )
  16. (en) Sergio De Simone, « Rust Gets Zero-Cost Async/Await Support in Rust 1.39 », sur www.infoq.com, (consulté le )
  17. (en) « The Async Ecosystem », sur rust-lang.github.io (consulté le )
  18. (en) Niko Matsakis, « Async-await on stable Rust! », sur blog.rust-lang.org, (consulté le )
  19. (en) « Hello Tokio », sur tokio.rs (consulté le )
  20. (en) Florian Rappl, Modern Frontend Development with Node.js : A Compendium for Modern JavaScript Web Development Within the Node.js Ecosystem, Birmingham, Packt Publishing, (ISBN 9781804617380, lire en ligne)
  21. (en) « I/O », sur tokio.rs (consulté le )
  22. (en) « Announcing tokio-uring: io-uring support for Tokio », sur tokio.rs, (consulté le )
  23. (en) Tony Sintes, « Four for the ages », sur InfoWorld, (consulté le )
  24. (en) Iban Eguia Moraza, Rust high performance : learn to skyrocket the performance of your Rust applications, Birmingham, UK, Packt Publishing, (ISBN 978-1-78847-823-6, OCLC 1033544275, lire en ligne)
  25. (en) Jim Blandy, Jason Orendoff et Leonara Tindall, Programming Rust, Sebastopol, O'Reilly Media, (ISBN 9781492052548, lire en ligne)
  • Portail des logiciels libres