[Rust] 多线程并发访问

Published on
10
// 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"] }


Recommended

[Rust] Rust语言圣经
[Rust] 模块与文件分离
Prev Post [Git] .gitignore 文件不生效解决方法
Next Post [hm-waterfall] 数据列表瀑布流,支持响应式,自定义列数,虚拟列表