Asynchrone Programmierung in Rust: Vollständiger Leitfaden für Anfänger

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Asynchrone Programmierung in Rust: Vollständiger Leitfaden für Anfänger

\n\n

Asynchrone Programmierung ist ein Paradigma, das es ermöglicht, mehrere Aufgaben gleichzeitig auszuführen, ohne den Hauptausführungsfluss zu blockieren. In Rust wird Asynchronität durch die Schlüsselwörter async und .await sowie durch eine leistungsstarke Laufzeitumgebung wie Tokio realisiert. Dieser Leitfaden hilft Ihnen, die Grundlagen der asynchronen Programmierung in Rust zu verstehen, selbst wenn Sie gerade erst anfangen.

\n\n

Was ist asynchrone Programmierung und warum wird sie benötigt?

\n\n

In traditionellem synchronem Code wird jede Operation nacheinander ausgeführt. Wenn ein Programm eine HTTP-Anfrage stellt, wartet es auf die Antwort, ohne etwas zu tun. Beim asynchronen Ansatz kann das Programm eine Anfrage initiieren und während des Wartens auf die Antwort zu einer anderen Aufgabe wechseln. Dies ist besonders wichtig für:

\n\n
    \n
  • Netzwerkanwendungen — Webserver, API-Clients, Chats.
  • \n
  • Dateiarbeiten — Lesen/Schreiben großer Datenmengen.
  • \n
  • Benutzeroberflächen — damit die Oberfläche während Hintergrundoperationen nicht "einfriert".
  • \n
\n\n

Rust bietet Nullkosten-Abstraktion: Asynchroner Code wird in effiziente Maschinenbefehle kompiliert. Im Gegensatz zu anderen Sprachen, in denen Asynchronität "aufwändig" sein kann, ermöglicht Rust das Schreiben schneller und sicherer asynchroner Programme.

\n\n

Grundlagen von async/await in Rust

\n\n

Die Schlüsselwörter async und .await sind die Grundlage der asynchronen Programmierung in Rust. Lassen Sie uns sie anhand eines einfachen Beispiels analysieren.

\n\n

1. Erstellen einer asynchronen Funktion

\n\n

Jede Funktion kann asynchron werden, indem man das Schlüsselwort async davor setzt. Eine solche Funktion gibt einen Future zurück – einen Wert, der noch nicht bereit ist, aber in Zukunft bereit sein wird.

\n\n
// Synchrone Funktion\nfn say_hello_sync() -> String {\n    String::from("Hello, World!")\n}\n\n// Asynchrone Funktion\nasync fn say_hello_async() -> String {\n    String::from("Hello, World!")\n}
\n\n

Beachten Sie: Wenn Sie einfach say_hello_async() aufrufen, wird der Code nicht ausgeführt. Sie erhalten ein Future-Objekt, das mit einer Laufzeitumgebung "gestartet" werden muss.

\n\n

2. Erwarten des Ergebnisses mit .await

\n\n

Um den Wert aus einem Future zu erhalten, verwenden Sie .await. Dieses Schlüsselwort teilt dem Compiler mit: "Setze die Ausführung dieser Funktion aus, bis der Future bereit ist, und lass andere Aufgaben arbeiten".

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

3. Asynchrone Blöcke

\n\n

Sie können auch asynchrone Codeblöcke "spontan" erstellen:

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

Laufzeitumgebung: Tokio – das Herz des asynchronen Rust

\n\n

async und .await allein starten keinen Code. Es wird eine Laufzeitumgebung benötigt – eine Ausführungsumgebung, die Aufgaben und den Planer verwaltet. Die beliebteste Bibliothek dafür ist Tokio.

\n\n

Installation von Tokio

\n\n

Fügen Sie in Cargo.toml hinzu:

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

Erstes asynchrones Projekt

\n\n

Um asynchronen Code zu starten, verwenden Sie das Makro #[tokio::main]. Es erstellt automatisch eine Laufzeitumgebung und startet Ihre Funktion.

\n\n
use tokio;\n\n#[tokio::main]\nasync fn main() {\n    println!("Starte asynchronen Code!");\n    let result = say_hello_async().await;\n    println!("Ergebnis: {}", result);\n}\n\nasync fn say_hello_async() -> String {\n    // Simulation einer langen Operation\n    tokio::time::sleep(tokio::time::Duration::from_secs(2)).await;\n    String::from("Hello, Async Wo                

Blogs

Buchempfehlungen