Programmation asynchrone en Rust : guide complet pour débutants

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Programmation asynchrone en Rust : guide complet pour débutants

\n\n

La programmation asynchrone est un paradigme qui permet d'exécuter plusieurs tâches simultanément sans bloquer le fil d'exécution principal. En Rust, l'asynchronisme est implémenté via les mots-clés async et .await, ainsi qu'à travers un runtime puissant comme Tokio. Ce guide vous aidera à comprendre les bases de la programmation asynchrone en Rust, même si vous débutez tout juste.

\n\n

Qu'est-ce que la programmation asynchrone et pourquoi en a-t-on besoin ?

\n\n

Dans le code synchrone traditionnel, chaque opération s'exécute séquentiellement. Si un programme effectue une requête HTTP, il attend la réponse sans rien faire. Dans l'approche asynchrone, le programme peut lancer une requête et passer à une autre tâche en attendant la réponse. C'est particulièrement important pour :

\n\n
    \n
  • Les applications réseau — serveurs web, clients API, chats.
  • \n
  • Le travail avec des fichiers — lecture/écriture de grands volumes de données.
  • \n
  • Les interfaces utilisateur — pour que l'interface ne "se fige" pas pendant les opérations en arrière-plan.
  • \n
\n\n

Rust offre une abstraction à coût zéro : le code asynchrone est compilé en instructions machine efficaces. Contrairement à d'autres langages où l'asynchronisme peut être "coûteux", Rust permet d'écrire des programmes asynchrones rapides et sécurisés.

\n\n

Les bases de async/await en Rust

\n\n

Les mots-clés async et .await sont le fondement de la programmation asynchrone en Rust. Analysons-les avec un exemple simple.

\n\n

1. Création d'une fonction asynchrone

\n\n

Toute fonction peut devenir asynchrone en ajoutant le mot-clé async devant elle. Une telle fonction retourne un Future — une valeur qui n'est pas encore prête mais le sera dans le futur.

\n\n
// Fonction synchrone\nfn say_hello_sync() -> String {\n    String::from("Hello, World!")\n}\n\n// Fonction asynchrone\nasync fn say_hello_async() -> String {\n    String::from("Hello, World!")\n}
\n\n

Remarque : si vous appelez simplement say_hello_async(), le code ne s'exécutera pas. Vous obtiendrez un objet Future qui doit être "lancé" à l'aide d'un runtime.

\n\n

2. Attente du résultat avec .await

\n\n

Pour obtenir la valeur d'un Future, utilisez .await. Ce mot-clé indique au compilateur : "suspend l'exécution de cette fonction jusqu'à ce que le Future soit prêt, et laisse les autres tâches travailler".

\n\n
async fn process() {\n    let result = say_hello_async().await;\n    println!("{}", result);\n}
\n\n

3. Blocs asynchrones

\n\n

Vous pouvez également créer des blocs de code asynchrones "à la volée" :

\n\n
let future = async {\n    let x = 10;\n    let y = 20;\n    x + y\n};\n\nlet result = future.await; // résultat : 30
\n\n

Runtime : Tokio — le cœur du Rust asynchrone

\n\n

À eux seuls, async et .await ne lancent pas le code. Un runtime est nécessaire — un environnement d'exécution qui gère les tâches et l'ordonnanceur. La bibliothèque la plus populaire pour cela est Tokio.

\n\n

Installation de Tokio

\n\n

Ajoutez dans Cargo.toml :

\n\n
[dependencies]\ntokio = { version = "1.0", features = ["full"] }
\n\n

Premier projet asynchrone

\n\n

Pour exécuter du code asynchrone, utilisez la macro #[tokio::main]. Elle crée automatiquement un runtime et lance votre fonction.

\n\n
use tokio;\n\n#[tokio::main]\nasync fn main() {\n    println!("Lancement du code asynchrone !");\n    let result = say_hello_async().await;\n    println!("Résultat : {}", result);\n}\n\nasync fn say_hello_async() -> String {\n    // Simulation d'une opération longue\n    tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;\n    String::from("Hello, Async Wo                

Blogs

Book Recommendations