Tokio异步使用

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![];
// controal concurrent number
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
}