1
1
use std::time::Duration;
2

            
3
use budget_executor::{blocking::threadsafe::Runtime, ReplenishableBudget};
4

            
5
const THREADS: usize = 10;
6
const TASKS_PER_THREAD: usize = 10;
7
const OPS_PER_TASK: usize = 10;
8

            
9
1
fn main() {
10
1
    let shared_budget = ReplenishableBudget::new(0);
11
1

            
12
1
    // Spawn multiple worker threads that all run tasks using a shared budget.
13
1
    let mut workers = Vec::new();
14
11
    for worker_id in 0..THREADS {
15
10
        let shared_budget = shared_budget.clone();
16
10
        workers.push(std::thread::spawn(move || worker(worker_id, shared_budget)));
17
10
    }
18

            
19
    // trickle-charge the tasks.
20
1001
    for _ in 0..=THREADS * TASKS_PER_THREAD * OPS_PER_TASK {
21
1001
        shared_budget.replenish(1);
22
1001
        std::thread::sleep(Duration::from_millis(1));
23
1001
    }
24

            
25
    // Wait for the threads to finish
26
11
    for worker in workers {
27
10
        worker.join().unwrap();
28
10
    }
29
1
}
30

            
31
10
fn worker(worker_id: usize, shared_budget: ReplenishableBudget) {
32
10
    Runtime::run_with_budget(
33
12773
        |runtime| async move { some_task_to_limit(worker_id, runtime).await },
34
10
        shared_budget,
35
10
    )
36
10
    .wait_until_complete();
37
10
}
38

            
39
10
async fn some_task_to_limit(worker_id: usize, runtime: Runtime<ReplenishableBudget>) {
40
10
    let mut tasks = Vec::new();
41
110
    for task_id in 0..TASKS_PER_THREAD {
42
100
        let task_runtime = runtime.clone();
43
100
        tasks.push(runtime.spawn(async move {
44
1100
            for op in 0..OPS_PER_TASK {
45
26161
                task_runtime.spend(1).await;
46
1000
                println!("Worker {worker_id}, Task {task_id}, Operation {op}");
47
            }
48
100
        }));
49
100
    }
50

            
51
110
    for task in tasks {
52
12771
        task.await;
53
    }
54
10
}
55

            
56
1
#[test]
57
1
fn runs() {
58
1
    main()
59
1
}