Tokio für Rust: Vollständige Anleitung mit Beispielen

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

Was ist Tokio und warum wird es benötigt?

\n\n

Tokio ist eine asynchrone Laufzeitumgebung für die Programmiersprache Rust. Es bietet eine Infrastruktur zum Schreiben schneller, zuverlässiger und skalierbarer Netzwerkanwendungen. Wenn Sie in Rust etwas schreiben, das mit dem Netzwerk, Dateien arbeitet oder eine parallele Verarbeitung von Anfragen ohne Blockierung von Threads erfordert, benötigen Sie Tokio.

\n\n

Im Gegensatz zum traditionellen Multithreading-Ansatz, bei dem jede Anfrage in einem separaten OS-Thread verarbeitet wird (was teuer und begrenzt ist), verwendet Tokio ein ereignisbasiertes asynchrones E/A-Modell. Ein einzelner Thread kann Tausende gleichzeitig geöffneter Verbindungen verarbeiten, indem er zwischen Aufgaben nur dann wechselt, wenn die aktuelle Aufgabe wartet (z. B. auf das Lesen aus einem Socket).

\n\n

Tokio ist nicht nur eine Bibliothek, es ist ein Ökosystem. Es umfasst:

\n
    \n
  • Laufzeitumgebung — Aufgabenplaner und Ereignistreiber (epoll/kqueue/IOCP)
  • \n
  • Standard-Netzwerkprotokolle — TCP, UDP, Unix Sockets
  • \n
  • Timer — sleep, interval, deadline
  • \n
  • Synchronisation — Mutexe, Semaphore, Barrieren für asynchronen Code
  • \n
  • Datei-E/A — asynchrones Lesen/Schreiben von Dateien
  • \n
  • Dienstprogramme — Kanäle (mpsc, oneshot, broadcast), Puffer, Codec
  • \n
\n\n

Tokio liegt Projekten wie dem Web-Framework Axum, dem HTTP-Client Reqwest, den WebSockets Tungstenite, der Datenbank SQLx und vielen anderen zugrunde.

\n\n

Installation

\n\n

Im Gegensatz zu Python (pip) oder Node.js (npm) verwendet Rust das Paketsystem Cargo. Um Tokio zu installieren, fügen Sie die Abhängigkeit in die Datei Cargo.toml ein:

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

Das Flag features = ["full"] aktiviert alle Tokio-Funktionen. Für Produktionsprojekte wird empfohlen, nur die benötigten Features auszuwählen, um die Kompilierzeit und die Binärgröße zu reduzieren:

\n\n
[dependencies]\ntokio = { version = "1", features = ["rt", "macros", "net", "io-util", "time", "sync"] }
\n\n

Wichtige Features:

\n
    \n
  • rt — Mehrthread-Laufzeitumgebung
  • \n
  • macros — Makros #[tokio::main] und tokio::select!
  • \n
  • net — TCP, UDP, Unix Sockets
  • \n
  • io-util — asynchrone Reader/Writer
  • \n
  • time — Timer und sleep
  • \n
  • sync — Synchronisationsprimitive
  • \n
  • fs — asynchrone Dateisystemarbeit
  • \n
  • process — asynchrones Starten von Befehlen
  • \n
  • signal — Verarbeitung von OS-Signalen
  • \n
\n\n

Schnellstart

\n\n

Erstellen wir einen einfachen HTTP-Server, der auf jede Anfrage mit "Hello, World!" antwortet. Dafür benötigen wir auch die Crate hyper (HTTP-Bibliothek auf Basis von Tokio):

\n\n
// Cargo.toml\n// [dependencies]\n// tokio = { version = "1", features = ["full"] }\n// hyper = { version = "1", features = ["server", "http1"] }\n\nuse hyper::service::service_fn;\nuse hyper::{Request, Response, Server};\nuse hyper::body::Incoming;\nuse std::convert::Infallible;\n\nasync fn handle_request(_req: Request<Incoming>) -> Result<Response<String>, Infallible> {\n    Ok(Response::new("Hello, World!".to_string()))\n}\n\n#[tokio::main]\nasync fn main() {\n    let addr = ([127, 0, 0, 1], 3000).into();\n    let server = Server::bind(&addr).serve(service_fn(handle_request));\n    println!("Server running on http://{}", addr);\n    if let Err(e) = server.await {\n        eprintln!("Server error: {}", e);\n    }\n}
\n\n

Führen Sie cargo run aus und öffnen Sie http://127.0.0.1:3000 im Browser. Sie sehen "Hello, World!".

\n\n

Wichtige Methoden und Funktionen

\n\n

1. tokio::spawn

Empfehlungen