Для чего нужна данная статья? :
- Для поиска компромисса между библиотеками и синтаксисом синхроизаии потоков.
Зачем Вам это уметь? :
- Ускорить параллельное выполнение кода.
________________________________________________________
Потоки стандартной библиотеки (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();
}