Warum Async? Das Problem mit synchronen Threads
Das C10K-Problem
Stell dir vor, dein Server soll 10.000 gleichzeitige Verbindungen bedienen. Mit synchronen Threads brauchst du 10.000 OS-Threads — das ist nicht skalierbar:
- Speicher: Jeder Thread braucht ~2MB Stack → 20GB RAM nur für Stacks
- Performance: Thread-Latience (Context Switching) wird zur Flaschenhals
- Limits: Die meisten Systeme erlauben nur ~1000-10000 Threads
Die Lösung: Asynchrone I/O
Async I/O löst das Problem durch Non-blocking Operations:
- Der Thread blockiert nicht, während auf I/O gewartet wird
- Stattdessen: "Ich will Daten lesen — ruf mich an, wenn sie da sind"
- Ein einzelner Thread kann Tausendeasync Operationen gleichzeitig managen
// Synchronous: blockiert den Thread
let data = file.read().unwrap(); // Thread wartet hier
// Asynchronous: gibt Kontrolle zurück
let data = file.read().await; // Thread kann andere Tasks bearbeiten
Async ≠ Parallel
Asynchron bedeutet: eine Operation gibt den Thread frei, während sie auf Externes (I/O, Timer) wartet. Parallel bedeutet: mehrere Dinge gleichzeitig ausführen (multi-Core).
Async ist kooperatives Multitasking: Tasks geben freiwillig die CPU ab. Parallel ist präemptives Multitasking: das OS entreißt Tasks die CPU.
Beide können kombiniert werden: async Tasks auf mehreren Threads.
Rusts Async-Modell
Rust verwendet Futures und async/await:
async fndefiniert eine asynchrone Funktion.awaitwartet auf das Ergebnis eines Futures- Keine Callbacks — Code liest sich sequentiell
📝 Schnellprüfung
Was ist der Hauptvorteil von Async I/O?
✅ Wichtige Erkenntnisse
Haken setzen, um deinen Lernfortschritt zu markieren: