task_manager/
task_manager.rs

1use coachman as cm;
2use coachman::try_await;
3use coachman::{Canceled, Completed};
4use std::time;
5
6async fn inner(i: usize) {
7    match try_await!(tokio::time::sleep(time::Duration::from_secs(i as u64))) {
8        Canceled => println!("task#{} inner canceled", i),
9        Completed(_) => println!("task#{} inner completed", i),
10    };
11}
12
13async fn outer(i: usize) {
14    match try_await!(inner(i)) {
15        Canceled => println!("task#{} outer canceled", i),
16        Completed(_) => println!("task#{} outer completed", i),
17    }
18
19    println!("task#{} canceled: {}", i, cm::is_task_canceled());
20}
21
22#[tokio::main(flavor = "current_thread")]
23async fn main() {
24    let mut task_manager = cm::TaskManager::builder().with_max_tasks(10).with_capacity(10).build();
25
26    let mut task_keys = Vec::new();
27    for i in 0..10 {
28        let task_key = task_manager.try_spawn(outer(i)).unwrap();
29        task_keys.push(task_key)
30    }
31
32    tokio::time::timeout(time::Duration::from_secs(5), task_manager.process(false)).await;
33
34    for task_key in task_keys {
35        if task_manager.cancel_task(task_key).is_ok() {
36            println!("task-{} canceled", task_key)
37        } else {
38            println!("task-{} already finished", task_key)
39        }
40    }
41
42    task_manager.join(true).await;
43}