Рубрика «Крейт дня» — краткий разбор популярных (и не очень) библиотек экосистемы Rust, которые экономят сотни часов разработки.
Сегодня в рубрике — rayon (один из самых популярных и изящных крейтов в мире Rust).
🛠 Проблема, которую он решает#
Допустим у вас есть огромный массив из 10 000 000 элементов и вам нужно применить к каждому элементу тяжелую операцию.
В обычном Rust вы пишете стандартный итератор:
let results: Vec<_> = data.iter()
.map(|x| heavy_computation(x))
.collect();Этот код выполняется строго в один поток. Если у вас 16-ядерный процессор, 15 ядер будут просто простаивать.
Писать параллельность вручную через thread::spawn, Arc<Mutex<T>> и каналы - дольше, а также можно допустить ошибки во владении памятью.
🚀 Решение через Rayon#
С крейтом rayon всё распараллеливание сводится к замене всего одного метода:
use rayon::prelude::*; // 1. Импортируем типажи Rayon
// 2. Меняем .iter() на .par_iter()
let results: Vec<_> = data.par_iter()
.map(|x| heavy_computation(x))
.collect();💡 За что Rayon любят разработчики?#
- Алгоритм Work-Stealing: Rayon автоматически создаст пулл потоков под количество ядер вашего процессора. Если один поток закончил свою порцию работы быстрее других, он не ждет, а «крадет» незавершенные задачи из очереди соседей.
- Гарантии безопасности типов: Благодарю типажам
SendиSync, если ваша функция или тип данных не являются поток-безопасными, компилятор Rust просто не даст вызвать.par_iter().
🔗 Репозиторий на GitHub: rayon-rs/rayon
📦 Crates.io: crates.io/crates/rayon
Статья прочитана
Пожалуйста, оцените насколько статья была вам полезна и понятна


