当前位置: 首页 > news >正文

rust学习-同时执行多Future

只用 .await 来执行future,会阻塞并发任务,直到特定的 Future 完成

join!:等待所有future完成

可事实上为什么都是res1完成后再执行res2?
join! 不保证并发执行,难道只负责同步等待?

示例

[package]
name = "rust_demo5"
version = "0.1.0"
edition = "2021"[dependencies]
futures = "0.3"
tokio = { version = "1.16.0", features = ["full"] }
tokio-stream = "0.1.14"
use futures::executor::block_on;
use std::thread::sleep;
use std::thread;
use std::time::Duration;
use futures::{future, join};async fn task_one() {println!("task_one: begin");thread::sleep(Duration::from_secs(4));println!("task_one: finish");
}async fn task_two() {println!("task_two: begin");thread::sleep(Duration::from_secs(2));println!("task_two: finish");
}#[tokio::main]
async fn main() {let (res1, res2) = join!(task_one(), task_two());// 在这里调用 res1 和 res2,它们分别对应异步任务1和异步任务2的输出结果// 先执行完task_one,再执行完task_two,然后再返回
}
use futures::executor::block_on;
use std::thread;
use futures::{future, join};async fn task_one() {println!("task_one: begin");for i in 1..=10_000_000 {if i % 100_000 == 0 {println!("task_one,  found a number: {}", i);}}println!("task_one: finish");
}async fn task_two() {println!("task_two: begin");for i in 1..=10_000_000 {if i % 100_000 == 0 {println!("task_two,  found a number: {}", i);}}println!("task_two: finish");
}#[tokio::main]
async fn main() {let (res1, res2) = join!(task_one(), task_two());// 在这里调用 res1 和 res2,它们分别对应异步任务1和异步任务2的输出结果
}

反例

不必在 get_book 完成后再 get_music

async fn get_book_and_music() -> (Book, Music) {let book = get_book().await;let music = get_music().await;(book, music)
}

try_join

返回 Result 的 future,考虑使用 try_join! 而非 join
join 只会在所有子 future 都完成后才会完成,它甚至会在子 future 返回 Err 之后继续处理
try_join! 会在其中的子future返回错误后立即完成

use futures::try_join;async fn get_book() -> Result<Book, String> { /* ... */ Ok(Book) }
async fn get_music() -> Result<Music, String> { /* ... */ Ok(Music) }async fn get_book_and_music() -> Result<(Book, Music), String> {let book_fut = get_book();let music_fut = get_music();try_join!(book_fut, music_fut)
}

传进 try_join! 的 future 必须要用相同的错误类型。
考虑使用 futures::future::TryFutureExt 库的 .map_err(|e| …) 或 err_into() 函数来统一错误类型:

use futures::{future::TryFutureExt,try_join,
};// Result 类型用于更好地处理和组织错误情况,并在避免出现非预期错误时提供便捷// 一种是一个内部类型为 Book 的成功结果,另一个是一个无内部类型 () 的错误结果
async fn 
http://www.lryc.cn/news/123138.html

相关文章:

  • 问道管理:旅游酒店板块逆市拉升,桂林旅游、华天酒店涨停
  • 算法通关村第三关——数组白银
  • 黑客利用 Facebook 漏洞,发起网络钓鱼攻击
  • React Router@3.x 升级到 @6.x 的实战
  • LAXCUS和GPU软硬件结合,构建强大算力生态
  • 学会这一招,轻松玩转小程序自动化
  • Mongodb 更新集合的方法到底有几种 (上) ?
  • 推荐5款能帮你解决各种问题的神器
  • 绕过 open_basedir
  • 如何使用SpringBoot 自定义转换器
  • 多线程(进阶)
  • 端口输入的数据为什么要打拍?
  • Qt读写Excel--QXlsx编译为静态库2
  • win11电脑查找已连接打印机ip的方法
  • 测试开发探索:“WeTalk“网页聊天室的测试流程与自动化
  • 图片增强组件实现
  • go.sum are different when using go mod vendor/download
  • Docker技术入门教程
  • Vue2-组件,组件的使用及注意点,组件嵌套,VueComponent构造函数,单文件组件
  • IntelliJ IDEA Bookmark使用
  • kriging-contour前端克里金插值
  • 第八章 CUDA内存应用与性能优化篇(中篇)
  • 适用于物联网 (IoT)的远距离、低功耗、低速率WiFi—Wi-Fi HaLow
  • 【解读Spikingjelly】使用单层全连接SNN识别MNIST
  • 穿越数字奇境:探寻元宇宙中的科技奇迹
  • 2024」预备研究生mem-阴影图形
  • 【设计模式】责任链模式
  • 解密人工智能:线性回归 | 逻辑回归 | SVM
  • 【FFMPEG应用篇】使用FFmpeg的常见问题
  • (vue)获取对象的键遍历,同时循环el-tab页展示key及内容