You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用async_std::task::sleep模拟阻塞操作并实现并发运行?

问题原因

你当前的代码中,await关键字会暂停当前main函数的执行流程,必须等待前一个hello_wait异步函数完全执行完成(等待1秒+打印Hello),才会执行下一行的hello_wait()调用,本质是5个任务串行执行,总耗时约5秒,不符合并发需求。

解决方案

有两种常用的修改方式可以实现任务并发执行:

方案1:显式spawn独立异步任务

通过async_std::task::spawn方法将每个hello_wait Future包装为独立的异步任务,所有任务创建后会被运行时自动调度并发执行,最后统一等待所有任务完成即可:

use std::{time::Duration};
use async_std::task;

async fn hello_wait(){
    task::sleep(Duration::from_millis(1000)).await;
    println!("Hello");
}

#[async_std::main]
async fn main() {
    // 批量创建并发任务,任务创建后立即开始调度
    let mut task_handles = Vec::with_capacity(5);
    for _ in 0..5 {
        task_handles.push(task::spawn(hello_wait()));
    }
    // 等待所有任务执行完毕
    for handle in task_handles {
        handle.await.unwrap();
    }
}

方案2:使用join_all批量等待Future

如果不需要单独控制每个任务的生命周期,可以用join_all工具直接批量等待所有Future并发执行完成:

  1. 先在Cargo.toml中添加依赖:
[dependencies]
async-std = { version = "1.12", features = ["attributes"] }
futures = "0.3"
  1. 代码修改如下:
use std::{time::Duration};
use async_std::task;
use futures::future::join_all;

async fn hello_wait(){
    task::sleep(Duration::from_millis(1000)).await;
    println!("Hello");
}

#[async_std::main]
async fn main() {
    let futures: Vec<_> = (0..5).map(|_| hello_wait()).collect();
    // 所有Future并发执行,全部完成后才会继续后续逻辑
    join_all(futures).await;
}

以上两种方案运行后总耗时都约为1秒,所有Hello语句会在等待结束后几乎同时输出,符合预期效果。

内容的提问来源于stack exchange,提问作者eminfedar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:45:04