// main.rs
use futures::future::join_all;
use reqwest::Client;
use std::sync::Arc;
use tokio::sync::Semaphore;
use tokio::task; // 引入join_all
#[tokio::main]
async fn main() {
let client = Client::new();
let semaphore = Arc::new(Semaphore::new(3000)); // 每次最多并发 3000 个任务
let total_requests = 100000; // 总共 1000 个请求
let mut tasks = Vec::new();
for _ in 0..total_requests {
let client = client.clone();
let permit = semaphore.clone().acquire_owned().await.unwrap(); // 获取信号量许可
// 创建异步任务
let task = task::spawn(async move {
let res = client
.get("网址")
.send()
.await;
match res {
Ok(response) => {
println!("请求成功,状态码:{}", response.status());
}
Err(e) => {
eprintln!("请求失败:{}", e);
}
}
drop(permit); // 释放信号量许可
});
tasks.push(task);
}
// 使用join_all来处理所有任务并确保它们都完成
let results = join_all(tasks).await;
// 处理任务结果
for result in results {
if let Err(e) = result {
eprintln!("任务执行失败:{:?}", e);
}
}
println!("所有请求已完成");
}
// Cargo.toml
[package]
name = "world_hello"
version = "0.1.0"
edition = "2021"
[dependencies]
reqwest = { version = "0.11", features = ["json"] }
tokio = { version = "1", features = ["full"] }
futures = "0.3"
serde = { version = "1.0", features = ["derive"] }