Rayon für Rust: Vollständiger Leitfaden 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 Rayon und wozu wird es benötigt?

\n\n

Rayon ist eine leistungsstarke Bibliothek für die Programmiersprache Rust, die eine einfache und sichere Möglichkeit zur Parallelisierung von Berechnungen bietet. Ihr Hauptmerkmal ist das Konzept der parallelen Iteratoren. Anstatt Threads, Mutexe und Kanäle manuell zu verwalten, ersetzen Sie einfach einen sequenziellen Iterator (`.iter()`) durch einen parallelen (`.par_iter()`), und Rayon verteilt die Arbeit automatisch auf alle verfügbaren Prozessorkerne.

\n\n

Wozu wird diese Bibliothek benötigt? In der modernen Welt sind Mehrkernprozessoren zum Standard geworden. Das manuelle Schreiben von Multithread-Code ist jedoch eine komplexe Aufgabe, die mit Datenrennen, Deadlocks und anderen schwer zu findenden Fehlern behaftet ist. Rayon übernimmt all diese Komplexitäten und bietet:

\n
    \n
  • Automatische Arbeitsverteilung: Die Bibliothek entscheidet selbst, wie die Daten aufgeteilt und auf die Threads verteilt werden.
  • \n
  • Typsicherheit: Dank des Ownership- und Borrowing-Systems von Rust garantiert Rayon die Abwesenheit von Datenrennen bereits zur Kompilierzeit.
  • \n
  • Work-Stealing (Arbeitsdiebstahl): Wenn ein Thread seine Aufgabe früher als andere beendet, "stiehlt" er Arbeit von beschäftigten Threads und sorgt so für eine gleichmäßige Auslastung aller Kerne.
  • \n
  • Einfachheit der Nutzung: Die API von Rayon ist für jeden Entwickler, der mit Rust-Iteratoren vertraut ist, intuitiv verständlich.
  • \n
\n\n

Rayon ist ideal für Aufgaben, bei denen große Datenmengen verarbeitet werden müssen: Bildverarbeitung, Simulationen, numerische Berechnungen, Dateiparsing und vieles mehr. Wenn sich Ihre Aufgabe leicht in unabhängige Teilaufgaben aufteilen lässt (Datenparallelität), ist Rayon Ihre Wahl.

\n\n

Installation

\n\n

Rayon wird auf dem Standardweg für Rust installiert – über den Paketmanager Cargo. Fügen Sie die folgende Zeile in die Datei Cargo.toml Ihres Projekts ein:

\n\n
[dependencies]\nrayon = "1.10"
\n\n

Führen Sie anschließend den Befehl cargo build aus, und Cargo lädt die Bibliothek automatisch herunter und kompiliert sie. Rayon ist eine "reine" Rust-Bibliothek, daher sind keine zusätzlichen Abhängigkeiten oder Systemanforderungen erforderlich. Sie funktioniert unter Windows, macOS und Linux.

\n\n

Schnellstart

\n\n

Beginnen wir mit einem klassischen Beispiel: der Summierung eines großen Zahlenarrays. Zuerst machen wir das sequenziell, dann parallel mit Rayon.

\n\n
// Bibliothek einbinden\nuse rayon::prelude::*;\n\nfn main() {\n    // Großen Vektor mit Zahlen erstellen\n    let numbers: Vec<u64> = (1..=10_000_000).collect();\n\n    // --- Sequenzielle Summierung ---\n    let sequential_start = std::time::Instant::now();\n    let sum_sequential: u64 = numbers.iter().sum();\n    let sequential_duration = sequential_start.elapsed();\n    println!("Sequenzielle Summe: {} (Zeit: {:?})", sum_sequential, sequential_duration);\n\n    // --- Parallele Summierung mit Rayon ---\n    let parallel_start = std::time::Instant::now();\n    let sum_parallel: u64 = numbers.par_iter().sum(); // .iter() durch .par_iter() ersetzt\n    let parallel_duration = parallel_start.elapsed();\n    println!("Parallele Summe: {} (Zeit: {:?})", sum_parallel, parallel_duration);\n\n    // Vergleich der Beschleunigung\n    println!("Beschleunigung: {:.2}x", sequential_duration.as_secs_f64() / parallel_duration.as_secs_f64());\n}
\n\n

In diesem Beispiel haben wir nur eine Änderung vorgenommen: Wir haben .iter() durch .par_iter() ersetzt. Rayon hat den Vektor automatisch aufgeteilt, auf die Threads verteilt, die Teilsummen berechnet und dann die Ergebnisse zusammengeführt. Auf einem Mehrkernprozessor werden Sie eine deutliche Beschleunigung sehen.

\n\n

Wichtige Methoden/Funktionen

\n\n

1. par_iter()

\n

Was es tut: Erstellt einen parallelen Iterator aus Referenzen auf die Elemente einer Sammlung. Dies ist die am häufigs

Empfehlungen