parallel_worker/
lib.rs

1//! # Parallel Worker
2//!
3//! This crate provides a simple interface for running tasks in parallel.
4//! The `Worker` struct is used to dispatch tasks to worker threads and collect the results.
5//! You can wait for results or recieve currently available results.
6//!
7//! ```rust
8//!  use parallel_worker::{State, Worker};
9//!
10//!  fn main() {
11//!     let worker = Worker::new(|n: u64, _s: &State| Some(42));
12//!
13//!     worker.add_task(1);
14//!     worker.add_task(2);
15//!
16//!     assert_eq!(worker.get_blocking(), Some(42));
17//!     
18//!     worker.add_tasks(0..10);
19//!
20//!     assert_eq!(worker.get_iter_blocking().count(), 11);
21//! }
22//! ```
23//!
24//! ## Tasks can be canceled
25//! Canceled tasks will stop executing as soon as they reach a `check_if_cancelled!`.
26//! Results of canceled tasks will be discarded even if they have already been computed.   
27//! ```rust
28//! # use parallel_worker::{check_if_cancelled, State, Worker};
29//! # use std::{thread::sleep, time::Duration};
30//! fn main() {
31//!     let worker = Worker::new(worker_function);
32//!
33//!     worker.add_task(1);
34//!
35//!     worker.cancel_tasks();
36//!
37//!     assert!(worker.get_blocking().is_none());
38//! }
39//!
40//! fn worker_function(task: u64, state: &State) -> Option<u64> {
41//!     for i in 0.. {
42//!         sleep(Duration::from_millis(50)); // Do some work
43//!         check_if_cancelled!(state); // Check if the task has been canceled
44//!     }
45//!     Some(42)
46//! }
47//!```
48//! ## Results can be optinal
49//! If a worker returns `None` the result will be discarded. 
50//! ```rust
51//! # use parallel_worker::{State, Worker};
52//! fn main() {
53//!     let worker = Worker::new(|n: u64, _s: &State| {
54//!         if n % 2 == 0 {
55//!             Some(n)
56//!         } else {
57//!             None
58//!         }
59//!     });
60//!     
61//!     worker.add_tasks(1..=10);
62//! 
63//!     assert_eq!(worker.get_iter_blocking().count(), 5); 
64//! }
65//! ```
66
67mod cell_utils;
68
69mod task_queue;
70
71mod worker_state;
72pub use crate::worker_state::State;
73
74mod worker;
75pub use crate::worker::Worker;