Перейти к основному содержимому
  1. Rust/

Крейт дня: Rayon - параллельные вычисления в одну строку

216 слов·2 минуты· loading · loading · ·
Рубрика «Крейт дня» — краткий разбор популярных (и не очень) библиотек экосистемы 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 любят разработчики?
#

  1. Алгоритм Work-Stealing: Rayon автоматически создаст пулл потоков под количество ядер вашего процессора. Если один поток закончил свою порцию работы быстрее других, он не ждет, а «крадет» незавершенные задачи из очереди соседей.
  2. Гарантии безопасности типов: Благодарю типажам Send и Sync, если ваша функция или тип данных не являются поток-безопасными, компилятор Rust просто не даст вызвать .par_iter().

🔗 Репозиторий на GitHub: rayon-rs/rayon
📦 Crates.io: crates.io/crates/rayon

Статья прочитана
Пожалуйста, оцените насколько статья была вам полезна и понятна

Связанные статьи