1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| use std::{sync::Arc, thread, time}; use tokio::spawn; use tokio::sync::Semaphore;
#[tokio::main] async fn main() { let total: i64 = 100; let mut tasks = vec![]; let semap = Arc::new(Semaphore::new(10)); for i in 1..total { let permit = semap.clone().acquire_owned().await.unwrap(); let t = spawn(async move { let res = do_some_work(i).await; drop(permit); res }); tasks.push(t); } let mut result: i64 = 0; for t in tasks { result += t.await.expect("failed"); } println!("result is {}", result); }
async fn do_some_work(i: i64) -> i64 { println!("number {}", i); thread::sleep(time::Duration::from_secs(1)); i * i }
|