Last active
March 2, 2024 12:04
-
-
Save fancellu/bb4d4b43dfa561b4db377542fcdfcbeb to your computer and use it in GitHub Desktop.
Rust tokio Semaphore example
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
use std::sync::Arc; | |
use tokio::sync::{Semaphore, SemaphorePermit}; | |
use tokio::time::sleep; | |
use tokio::time::Duration; | |
async fn person(sem: Arc<Semaphore>, name: String) { | |
println!("Person {}: waiting for a permit", name); | |
teller(sem, &name).await; | |
println!("\tPerson {} finished", name); | |
} | |
async fn teller(sem: Arc<Semaphore>, name: &String) { | |
// simulating time to walk to teller | |
let time = rand::random::<u8>() % 3 + 1; | |
sleep(Duration::from_secs(time as u64)).await; | |
let permit: SemaphorePermit = sem.acquire().await.unwrap(); | |
println!("Teller: I have a permit! for {}", name); | |
// simulating time to talk to teller | |
let time = rand::random::<u8>() % 3 + 2; | |
println!(" Teller: Talking to {} for {} seconds", name, time); | |
sleep(Duration::from_secs(time as u64)).await; | |
drop(permit) | |
} | |
#[tokio::main] | |
async fn main() { | |
let num_tellers = 4; | |
let sem = Semaphore::new(num_tellers); | |
let sem_arc = Arc::new(sem); | |
let mut handles = Vec::new(); | |
for i in 0..10 { | |
let name = format!("Person {}", i); | |
handles.push(tokio::spawn(person(sem_arc.clone(), name))); | |
} | |
for handle in handles { | |
handle.await.unwrap(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Output
Person Person 0: waiting for a permit
Person Person 1: waiting for a permit
Person Person 2: waiting for a permit
Person Person 3: waiting for a permit
Person Person 4: waiting for a permit
Person Person 5: waiting for a permit
Person Person 6: waiting for a permit
Person Person 7: waiting for a permit
Person Person 8: waiting for a permit
Person Person 9: waiting for a permit
Teller: I have a permit! for Person 6
Teller: I have a permit! for Person 1
Teller: Talking to Person 1 for 4 seconds
Teller: Talking to Person 6 for 4 seconds
Teller: I have a permit! for Person 9
Teller: Talking to Person 9 for 4 seconds
Teller: I have a permit! for Person 5
Teller: Talking to Person 5 for 2 seconds
Person Person 5 finished
Teller: I have a permit! for Person 8
Teller: Talking to Person 8 for 4 seconds
Person Person 6 finished
Person Person 1 finished
Teller: I have a permit! for Person 7
Teller: Talking to Person 7 for 3 seconds
Teller: I have a permit! for Person 3
Teller: Talking to Person 3 for 3 seconds
Person Person 9 finished
Teller: I have a permit! for Person 4
Teller: Talking to Person 4 for 4 seconds
Person Person 8 finished
Person Person 7 finished
Person Person 3 finished
Teller: I have a permit! for Person 2
Teller: Talking to Person 2 for 3 seconds
Teller: I have a permit! for Person 0
Teller: Talking to Person 0 for 2 seconds
Person Person 4 finished
Person Person 0 finished
Person Person 2 finished