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 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 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 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}