如何使用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并发执行完成:
- 先在Cargo.toml中添加依赖:
[dependencies] async-std = { version = "1.12", features = ["attributes"] } futures = "0.3"
- 代码修改如下:
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
相关产品推荐
相关产品推荐

