Skip to content

Instantly share code, notes, and snippets.

@fancellu
Last active March 2, 2024 12:04
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fancellu/bb4d4b43dfa561b4db377542fcdfcbeb to your computer and use it in GitHub Desktop.
Save fancellu/bb4d4b43dfa561b4db377542fcdfcbeb to your computer and use it in GitHub Desktop.
Rust tokio Semaphore example
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();
}
}
@fancellu
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment