Skip to main content

concurrency_control/
concurrency_control.rs

1use 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}