Skip to main content

pool/
pool.rs

1#![allow(
2    clippy::print_stderr,
3    clippy::use_debug,
4    clippy::missing_docs_in_private_items,
5    clippy::unwrap_used
6)]
7
8use std::num::NonZeroUsize;
9use std::thread;
10use std::time::Duration;
11use tarnish::{ProcessPool, Task};
12
13#[derive(Default)]
14struct HeavyComputation;
15
16impl Task for HeavyComputation {
17    type Input = usize;
18    type Output = u64;
19    type Error = String;
20
21    fn run(&mut self, input: usize) -> Result<u64, String> {
22        let pid = std::process::id();
23        eprintln!("[Worker PID {pid}] Starting computation for input {input}");
24
25        // Simulate heavy computation with sleep
26        thread::sleep(Duration::from_millis(500));
27
28        let result: u64 = (0..input).map(|x| x as u64).sum();
29        eprintln!("[Worker PID {pid}] Completed: {result}");
30        Ok(result)
31    }
32}
33
34fn main() {
35    tarnish::main::<HeavyComputation>(|| {
36        eprintln!("Creating pool with 4 workers...");
37
38        let size = NonZeroUsize::new(4).unwrap();
39        let mut pool = match ProcessPool::<HeavyComputation>::new(size) {
40            Ok(p) => p,
41            Err(e) => {
42                eprintln!("Failed to create pool: {e}");
43                return;
44            }
45        };
46
47        let pool_size = pool.size();
48        eprintln!("Pool size: {pool_size}\n");
49
50        // Process 12 tasks across 4 workers
51        // Each worker should get ~3 tasks due to round-robin
52        eprintln!("Processing 12 tasks across {pool_size} workers:\n");
53
54        for i in 1_usize..=12 {
55            eprintln!("[Parent] Submitting task {i}");
56
57            // Use saturating_mul to avoid arithmetic overflow
58            let input = i.saturating_mul(100);
59
60            match pool.call(input) {
61                Ok(result) => eprintln!("[Parent] Task {i} result: {result}\n"),
62                Err(e) => eprintln!("[Parent] Task {i} failed: {e}\n"),
63            }
64        }
65
66        eprintln!("All tasks completed!");
67    });
68}