async_global_executor/init.rs
1use std::sync::atomic::{AtomicBool, Ordering};
2
3/// Init the global executor, spawning as many threads as specified or
4/// the value specified by the specified environment variable.
5///
6/// # Examples
7///
8/// ```
9/// async_global_executor::init_with_config(
10/// async_global_executor::GlobalExecutorConfig::default()
11/// .with_env_var("NUMBER_OF_THREADS")
12/// .with_min_threads(4)
13/// .with_max_threads(6)
14/// .with_thread_name_fn(Box::new(|| "worker".to_string()))
15/// );
16/// ```
17pub fn init_with_config(config: crate::config::GlobalExecutorConfig) {
18 let _ = crate::config::GLOBAL_EXECUTOR_CONFIG.set(config.seal());
19 init();
20}
21
22/// Init the global executor, spawning as many threads as the number or cpus or
23/// the value specified by the `ASYNC_GLOBAL_EXECUTOR_THREADS` environment variable
24/// if specified.
25///
26/// # Examples
27///
28/// ```
29/// async_global_executor::init();
30/// ```
31pub fn init() {
32 static INIT_DONE: AtomicBool = AtomicBool::new(false);
33 if !INIT_DONE.swap(true, Ordering::SeqCst) {
34 let config =
35 crate::config::GLOBAL_EXECUTOR_CONFIG.get_or_init(crate::config::Config::default);
36 crate::reactor::block_on(async {
37 crate::threading::spawn_more_threads(config.min_threads)
38 .await
39 .expect("cannot spawn executor threads");
40 });
41 }
42}