fast_threadpool/
config.rs

1use crate::*;
2
3#[derive(Clone, Copy, Debug)]
4/// Thread pool configuration
5pub struct ThreadPoolConfig {
6    pub(crate) keep_alive: Duration,
7    pub(crate) min_workers: NonZeroU16,
8    pub(crate) max_workers: NonZeroU16,
9    pub(crate) min_available_workers: NonZeroU16,
10    pub(crate) max_available_workers: NonZeroU16,
11    pub(crate) queue_size: Option<usize>,
12}
13
14impl Default for ThreadPoolConfig {
15    fn default() -> Self {
16        let min_workers = NonZeroU16::new(num_cpus::get() as u16)
17            .unwrap_or(unsafe { NonZeroU16::new_unchecked(4) });
18        ThreadPoolConfig {
19            keep_alive: Duration::from_secs(30),
20            min_workers,
21            max_workers: unsafe { NonZeroU16::new_unchecked(512) },
22            min_available_workers: unsafe { NonZeroU16::new_unchecked(4) },
23            max_available_workers: min_workers,
24            queue_size: Some(64),
25        }
26    }
27}
28
29impl ThreadPoolConfig {
30    /// Low configuration
31    pub fn low() -> Self {
32        ThreadPoolConfig {
33            keep_alive: Duration::from_secs(5),
34            min_workers: unsafe { NonZeroU16::new_unchecked(1) },
35            max_workers: unsafe { NonZeroU16::new_unchecked(3) },
36            min_available_workers: unsafe { NonZeroU16::new_unchecked(1) },
37            max_available_workers: unsafe { NonZeroU16::new_unchecked(3) },
38            queue_size: Some(4),
39        }
40    }
41    ///
42    pub fn keep_alive(mut self, keep_alive: u64) -> Self {
43        self.keep_alive = Duration::from_secs(keep_alive);
44        self
45    }
46    ///
47    pub fn min_workers(mut self, min_workers: NonZeroU16) -> Self {
48        self.min_workers = min_workers;
49        self
50    }
51    ///
52    pub fn max_workers(mut self, max_workers: NonZeroU16) -> Self {
53        assert!(self.max_available_workers < max_workers);
54        self.max_workers = max_workers;
55        self
56    }
57    ///
58    pub fn min_available_workers(mut self, min_available_workers: NonZeroU16) -> Self {
59        self.min_available_workers = min_available_workers;
60        self
61    }
62    ///
63    pub fn max_available_workers(mut self, max_available_workers: NonZeroU16) -> Self {
64        assert!(max_available_workers < self.max_workers);
65        self.max_available_workers = max_available_workers;
66        self
67    }
68    ///
69    pub fn queue_size(mut self, queue_size: Option<usize>) -> Self {
70        self.queue_size = queue_size;
71        self
72    }
73}