Найти тему
Один Rust не п...Rust

Потоки в Rust

Оглавление

Для чего нужна данная статья? :

- Для поиска компромисса между библиотеками и синтаксисом синхроизаии потоков.

Зачем Вам это уметь? :

- Ускорить параллельное выполнение кода.

________________________________________________________

Потоки стандартной библиотеки (std::thread):

  • Это поток операционной системы, обеспечивают параллельное выполнение кода.

use std::thread;
fn main() {

let handle = thread::spawn(|| {

for i in 1..10 {

println!("Hello from the spawned thread: {}", i);

thread::sleep(std::time::Duration::from_millis(1));

}

});
for i in 1..5 {

println!("Hello from the main thread: {}", i);

thread::sleep(std::time::Duration::from_millis(1));

}

handle.join().unwrap();

}

Потоки с использованием std::thread::Builder:

  • std::thread::Builder предоставляет дополнительные возможности для создания потоков, такие как задание имени и размера стека потока.

use std::thread;

fn main() {

let builder = thread::Builder::new()

.name("custom_thread".into())

.stack_size(4 * 1024 * 1024); // 4 MB stack size

let handle = builder.spawn(|| {

println!("Hello from the custom thread!");

}).unwrap();

handle.join().unwrap();

}

Асинхронные потоки (async/await):

  • Асинхронное программирование - неблокирующий код с помощью ключевых слов async и await. Асинхронные задачи (futures) могут выполняться параллельно, но они не являются потоками ОС.

use tokio::time::{sleep, Duration};

#[tokio::main]

async fn main() {

let task1 = tokio::spawn(async {

for i in 1..10 {

println!("Hello from the first async task: {}", i);

sleep(Duration::from_millis(1)).await;

}

});

let task2 = tokio::spawn(async {

for i in 1..10 {

println!("Hello from the second async task: {}", i);

sleep(Duration::from_millis(1)).await;

}

});
task1.await.unwrap();

task2.await.unwrap();

}

Пулы потоков (threadpool, rayon):

  • Библиотеки, такие как threadpool и rayon, предоставляют пулы потоков для управления параллельными задачами и облегчают их использование.

use rayon::prelude::*;

fn main() {

let nums: Vec<i32> = (1..10).collect();

nums.par_iter().for_each(|n| {

println!("Hello from a rayon thread: {}", n);

});

}

Scoped Threads (потоки с областями видимости) с библиотекой crossbeam:

  • Библиотека crossbeam предоставляет scoped threads, которые позволяют создавать потоки с заимствованием данных из родительского потока.

use crossbeam::thread;

fn main() {

let data = vec![1, 2, 3, 4, 5];

thread::scope(|s| {

s.spawn(|_| {

println!("Hello from the scoped thread with data: {:?}", data);
});

}).unwrap();

}