concurrency_control/
concurrency_control.rs1use async_trait::async_trait;
2use minitimer::{TaskBuilder, TaskRunner};
3use std::sync::Arc;
4use std::sync::atomic::{AtomicUsize, Ordering};
5use tokio::time::{Duration, sleep};
6
7struct ConcurrentTask {
8 task_id: u64,
9 active_count: Arc<AtomicUsize>,
10}
11
12#[async_trait]
13impl TaskRunner for ConcurrentTask {
14 type Output = ();
15
16 async fn run(&self) -> Result<Self::Output, Box<dyn std::error::Error + Send + Sync>> {
17 let current = self.active_count.fetch_add(1, Ordering::SeqCst);
18 println!(
19 "Task {} started. Active count: {}",
20 self.task_id,
21 current + 1
22 );
23
24 sleep(Duration::from_millis(500)).await;
25
26 let remaining = self.active_count.fetch_sub(1, Ordering::SeqCst);
27 println!(
28 "Task {} completed. Active count: {}",
29 self.task_id,
30 remaining - 1
31 );
32
33 Ok(())
34 }
35}
36
37#[tokio::main]
38async fn main() {
39 let active_count = Arc::new(AtomicUsize::new(0));
40 let max_concurrency = 3;
41
42 let timer = minitimer::MiniTimer::new();
43
44 for i in 1..=5 {
45 let task = TaskBuilder::new(i)
46 .with_frequency_once_by_seconds(1)
47 .with_max_concurrency(max_concurrency)
48 .spwan_async(ConcurrentTask {
49 task_id: i,
50 active_count: active_count.clone(),
51 })
52 .unwrap();
53
54 timer.add_task(task).unwrap();
55 }
56
57 println!(
58 "Timer started. Added 5 tasks with max concurrency of {}. Waiting 3 seconds...",
59 max_concurrency
60 );
61 sleep(Duration::from_secs(3)).await;
62
63 println!("Example completed.");
64}