1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use std::{future::Future, panic::catch_unwind, thread};
use once_cell::sync::Lazy;
use smol::{block_on, future, Executor, Task};
pub fn spawn<T: Send + 'static>(future: impl Future<Output = T> + Send + 'static) -> Task<T> {
static GLOBAL: Lazy<Executor<'_>> = Lazy::new(|| {
for n in 1..=4 {
thread::Builder::new()
.name(format!("smol-{}", n))
.spawn(|| loop {
catch_unwind(|| block_on(GLOBAL.run(future::pending::<()>()))).ok();
})
.expect("cannot spawn executor thread");
}
Executor::new()
});
GLOBAL.spawn(future)
}