About
simboli_thread, thread pool management written in rust.
Warning
there is still a memory leak occurring and unstable.
Changelog
changelog.md
Starting
Installation
Run the following Cargo command in your project directory:
cargo add simboli_thread
Or add the following line to your Cargo.toml:
simboli_thread = "0.0.2"
Code
use std::{thread::sleep, time::Duration};
use simboli_thread::{OutputTrait, SimboliThread, TaskTrait, TaskWithDependenciesTrait};
enum MyOutput {
Number(i32),
String(String),
None,
}
impl OutputTrait for MyOutput {}
enum MyTask {
Exec(fn() -> MyOutput),
ExecWithDependencies(
fn(dependencies: &'static Vec<simboli_thread::Waiting<MyOutput>>) -> MyOutput,
),
}
impl TaskTrait<MyOutput> for MyTask {
fn exec(&self) -> MyOutput {
match self {
MyTask::Exec(f) => f(),
_ => MyOutput::None,
}
}
}
impl TaskWithDependenciesTrait<MyOutput> for MyTask {
fn exec(&self, dependencies: &'static Vec<simboli_thread::Waiting<MyOutput>>) -> MyOutput {
match self {
MyTask::ExecWithDependencies(f) => f(dependencies),
_ => MyOutput::None,
}
}
}
fn main() {
let thread_pool = SimboliThread::<MyTask, MyTask, MyOutput, 4, 64>::init();
let task_1 = thread_pool.spawn_task(MyTask::Exec(|| {
sleep(Duration::from_millis(100));
MyOutput::Number(10)
}));
let task_2 = thread_pool.spawn_task(MyTask::Exec(|| {
sleep(Duration::from_millis(100));
MyOutput::String("done".to_string())
}));
let task_1 = task_1.block();
if let Some(MyOutput::Number(number)) = task_1 {
println!("task_1 : {}", number)
}
let task_2 = task_2.block();
if let Some(MyOutput::String(str)) = task_2 {
println!("task_2 : {}", str)
}
thread_pool.join();
}