Rust Async 异步编程(八):join!

【Rust异步编程】Rust异步编程原理解析、标准库实现与第三方库实现详解 异步编程是一种允许程序在等待某些操作(如I/O)完成时继续执行其他任务的编程范式。与传统的同步编程相比,异步编程可以显著提高程序的吞吐量和资源利用率。 在Rust中,异步编程具有以下特点: 非阻塞执行:任务可以在等待时让出控制权 轻量级:异步任务(称为future)比线程更轻量 显式标记:使用async/await语法明确标识异步代码 阅读详情

Rust Async 异步编程(八):join!

Rust Async 异步编程(八):join!

招数单一,杀伤力惊人,说的就是 .await ,但是光用它,还真做不到一招鲜吃遍天。比如我们该如何同时运行多个任务,而不是使用 .await 慢悠悠地排队完成。

futures 包中提供了很多实用的工具,其中一个就是 join! 宏, 它允许我们同时等待多个不同 Future 的完成,且可以并发地运行这些 Future。

先来看一个不是很给力的、使用 .await 的版本:

async fn enjoy_book_and_music() -> (Book, Music) {
    let book = enjoy_book().await;
    let music = enjoy_music().await;
    (book, music)
}

这段代码可以顺利运行,但是有一个很大的问题,就是必须先看完书后,才能听音乐。

要支持同时看书和听歌,有些人可能会凭空生成下面代码:

// WRONG -- 别这么做
async fn enjoy_book_and_music() -> (Book, Music) {
    let book_future = enjoy_book();
    let music_future = enjoy_music();
    (book_future.await, music_future.await)
}

看上去像模像样,嗯,在某些语言中也许可以,但是 Rust 不行。因为在某些语言中,Future 一旦创建就开始运行,等到返回的时候,基本就可以同时结束并返回了。 但是 Rust 中的 Future 是惰性的,直到调用 .await 时,才会开始运行。而那两个 await 由于在代码中有先后顺序,因此它们是顺序运行的。

为了正确的并发运行两个 Future,我们来试试 futures::join! 宏:

use futures::join;

async fn enjoy_book_and_music() -> (Book, Music) {
    let book_fut = enjoy_book();
    let music_fut = enjoy_music();
    join!(book_fut, music_fut)
}

这样目标就顺利达成了。同时 join! 会返回一个元组,里面的值是对应的 Future 执行结束后输出的值。

由于join!必须等待它管理的所有 Future 完成后才能完成,如果你希望在某一个 Future 报错后就立即停止所有 Future 的执行,可以使用 try_join!,特别是当 Future 返回 Result 时:

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 和 err_info 方法将错误进行转换:

use futures::{
    future::TryFutureExt,
    try_join,
};

async fn get_book() -> Result<Book, ()> { /* ... */ 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().map_err(|()| "Unable to get book".to_string());
    let music_fut = get_music();
    try_join!(book_fut, music_fut)
}

参考:

  1. https://github.com/rustcn-org/async-book
  2. https://www.bilibili.com/video/BV1Ki4y1C7gj
我的AI学习 ai维护工具之langfuse as_type: Optional[Literal[‘generation’]] = None, # 将记录定义为 Observation (LLM 调用)transform_to_string: Optional[Callable[[Iterable], str]] = None # 将输出转为 string。要用LangFuse的云服务,首先要在LangFuse官网上注册,注册完后将页面拉倒最后,点免费的SignUp,API文档:https://api.reference.langfuse.com/ 阅读详情

相关推荐

Origin2018(汉化版)在使用科学计数法的时候如何将坐标刻度的0.0改成0

文章目录1 问题2 解决方法 1 问题 先看下面这张图,当我使用科学计数法时,纵坐标出现了0.0的字样,这样看起来很不美观。有些期刊还会有要求,不能出现0.0的格式。 图1 那么该怎么将它改成0呢?首先让我们尝试着用Origin自带的属性,看看能不能设置。 2 解决方法 解决方法一: step1: 双击坐标轴,打开坐标轴属性设置。 step2: 在刻度线标签选项中设置左轴的显示 图2 会发现,按照图2的方式改好之后,其它的小数位也全没了,如果但是有些数字就被覆盖了,这显然不是我

qq_40077565的博客 2万+

Rust: join,与concat

Rust的高阶函数使用频率很高,经常会碰到“扁平化”的降维处理,此时,join与concat的作用很明显。经常可能用到。

代码过客 3821

相控阵雷达仿真入门:TWS与TAS模式实战解析(附代码示例)

本文深入解析相控阵雷达仿真中的TWS(边搜索边跟踪)与TAS(搜索加跟踪)模式,提供实战代码示例和优化策略。通过简化模型设计和对象化建模,帮助开发者快速构建高效仿真系统,适用于军事推演和装备评估。文章涵盖核心逻辑、数据结构设计及性能优化技巧,提升仿真效率与准确性。

weixin_30687051的博客 455

rust多线程

在rust中,多线程编程不算困难,但是也需要留心和别的编程语言中不同的地方。rust的标准库中提供的thread库来帮助我们进行多线程编程。在使用的时候需要使用来引入thread库即可。

zy010101博客 2448

无监督学习初探:K-Means聚类与主成分分析(PCA)

K-Means适用于快速分组,但对数据分布敏感,可结合轮廓系数评估质量。PCA通过特征值分解实现线性降维,需注意非线性场景的替代方案(如UMAP)。进阶方向:聚类:谱聚类、高斯混合模型(GMM)处理复杂形状。降维:t-SNE、自编码器处理非线性结构。

weixin_69882801的博客 1454

MetaERP 的管理单元在设计哲学和实现逻辑上,确实与 Oracle EBS 的业务实体(OU)一脉相承,你可以放心地在已知的 Oracle 多组织架构框架下进行理解。它并没有推翻这套经典的核算模型

MetaERP的管理单元设计继承了Oracle EBS业务实体(OU)的核心思想,并进行了现代技术重构。管理单元(MU)作为OU的超集,延续了业务数据隔离与流程执行边界的定位,但通过元数据驱动的多租户架构实现更灵活的数据隔离。MetaERP采用三层解耦设计(核算单元、自然科目、核算维度),解决了EBS科目组合爆炸问题,并实现事件驱动的实时核算。相较于EBS的批处理模式,MetaERP通过云原生架构和元数据驱动配置,显著提升了灵活性、实时性和扩展性,支持跨法人的业务统一管理视图。

金牌架构师 576

Rust入坑指南:齐头并进(上)

我们知道,如今CPU的计算能力已经非常强大,其速度比内存要高出许多个数量级。为了充分利用CPU资源,多数编程语言都提供了并发编程的能力,Rust也不例外。 聊到并发,就离不开多进程和多线程这两个概念。其中,进程是资源分配的最小单位,而线程是程序运行的最小单位。线程必须依托于进程,多个线程之间是共享进程的内存空间的。进程间的切换复杂,CPU利用率低等缺点让我们在做并发编程时更加倾向于使用多线程的方式...

K_Ohaha的博客 1089

6.Burp Suite 入门篇 —— Burp Scanner 漏洞扫描

Burp Scanner 既可以是独立的全自动扫描器,也可以在手动测试中当作强大的辅助手段,而且随着技术改进,Burp Scanner 能检测到的漏洞数量也在不断增加。Burp Scanner 功能只在 burpsuite 专业版和企业版中里有,本篇教程讲的是专业版的 Burp Scanner 用法。

YouTheFreedom的博客 1万+

rust 并发

go 语言面试中,经常会被问到 go 语言的优势,go 的高并发能力便是优势之一。那么,rust 的并发如何呢?我们先从如何使用并发谈起,接下来会列举几个例子来说明 rust 并发编程。

小知识折射大智慧 5141

Windows 下运行 openclaw 出现“‘openclaw‘ 不是内部或外部命令,也不是可运行的程序或批处理文件“的解决方案

方案适用场景推荐指数检查并手动添加 PATH明确知道全局安装目录,只是没加进PATH⭐⭐⭐⭐⭐pnpm setup 自动配置使用 pnpm 安装,想要省心的自动化方式⭐⭐⭐⭐⭐npx 免安装临时运行快速验证核心程序是否正常,排除法排查⭐⭐⭐⭐清理残留后重装npm/pnpm 混用导致版本混乱⭐⭐⭐⭐改用 WSL2不熟悉 Windows 路径体系,长期使用⭐⭐⭐'openclaw' 不是内部或外部命令这类报错,本质上不是"程序坏了",而是。

一键难忘的博客 1万+

手把手教你学Simulink--基于电能质量与无功补偿的场景实例:统一电能质量调节器(UPQC)的联合控制仿真

在现代电力系统中,电能质量问题有源电力滤波器(APF)→ 治理谐波与无功动态电压恢复器(DVR)→ 补偿电压暂降/暂升静止无功发生器(SVG)→ 无功补偿与电压支撑而统一电能质量调节器(Unified Power Quality Conditioner, UPQC)是一种集串联补偿与并联补偿于一体的全能型电能质量治理装置✅ 电压类问题:暂降、暂升、不平衡、闪变✅ 电流类问题:谐波、无功、三相不平衡✅ 实现双向有功交换(储能型)串联单元(DVR功能):串联于线路,控制电源侧电压质量并联单元。

MHD0815的博客 240

【Rust】17. Rust 中的并发

r

newCraftsman的博客 847

《RT-DETR魔术师》专栏介绍 & 优快云独家改进创新实战 & 专栏目录

通过本专栏的阅读,后续你也可以自己魔改网络,在网络不同位置(Backbone、head、neck、loss等)进行魔改,实现创新!!!

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 7378

5个必学的Rust async/await模式:async-book最佳实践

Rust的异步编程模型通过async/await语法提供了高效的并发解决方案,而async-book项目则是掌握这一技术的权威指南。本文将从async-book中精选5个最实用的async/await设计模式,帮助开发者快速构建可靠的异步应用。这些模式涵盖了基础语法、并发控制、错误处理等核心场景,全部来自async-book项目的实战案例。 ## 1. 基础异步函数:async fn与await

gitblog_00392的博客 739

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【跟小嘉学 Rust 编程】二十七、Rust 异步编程(Asynchronous Programming)

本章节讲解 Rust 的异步编程方案,我们将讲解 Future、Waker、Executor、Pin、async 和 await、Stream等主要教材参考 《The Rust Programming Language》主要教材参考 《Rust For Rustaceans》主要教材参考 《The Rustonomicon》主要教材参考 《Rust 高级编程》主要教材参考 《Cargo 指南》主要教材参考 《Rust 异步编程》并发是程序同时有多个正在运行的线程。

小嘉丶学长的博客 3243

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Rust异步编程入门与实战:从理论到实践

在开始之前,我想先聊聊什么是异步编程。异步编程是一种编程范式,它允许程序在等待某些操作(如网络请求、文件I/O等)完成时,继续执行其他任务,而不是阻塞等待。传统的同步编程模型中,当我们执行一个耗时操作时,程序会一直等待这个操作完成,然后才继续执行下一步。这种方式在处理并发任务时效率较低,因为CPU在等待I/O操作时处于空闲状态。而异步编程模型中,当我们执行一个耗时操作时,程序会注册一个回调函数,然后继续执行其他任务。当耗时操作完成时,系统会通知程序,然后执行相应的回调函数。

no1coder的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Rust 异步控制流实战:async 通道、Join 与 Select 组合并发逻辑

本篇技术指南以 Google Comprehensive Rust 课程([src/concurrency/async-control-flow.md](https://link.gitcode.com/i/19565751305a8ccdc8e60fe78cf948c6))中的 "Channels and Control Flow" 章节为核心,系统讲解 Rust 异步编程中三种核心控制流原语:

gitblog_00398的博客 744

comprehensive-rust 课程解读:Rust Async 异步编程基础——Futures、async/await、任务与运行时

> 本文基于 Google Android 团队维护的 Rust 培训课程 [comprehensive-rust](https://link.gitcode.com/i/0a832b9543e51ae71de28fbd00aa78f4) 中 Concurrency(并发)模块的 "Async Basics" 章节撰写。该章节的入口文档为 [src/concurrency/async.md](ht

gitblog_00497的博客 410

Rust异步编程的错误处理艺术

Rust异步编程错误处理摘要 Rust异步编程中的错误处理与同步编程存在显著差异。异步错误主要通过Future<Output = Result<T, E>>类型返回,常见类型包括: IO错误(文件/网络操作失败) 超时错误(操作未在时限内完成) 取消错误(任务被主动终止) 业务逻辑错误(自定义规则违反) 系统错误(权限/资源问题) 处理技巧: 使用?操作符简化错误传播 避免使用unwrap()/expect()防止任务崩溃 为业务错误实现自定义错误类型 利用Tokio提供的超时和任务

编程世界如山海,探索不止。 8407

Rust异步编程实战:构建高性能网络应用

本文介绍了Rust异步编程的核心概念与实践方法。首先对比了同步与异步编程的区别,阐述了异步编程在高并发场景下的优势。随后详细讲解了Rust异步编程的演进历程,重点介绍了Future、Poll和Waker三个核心概念。文章通过代码示例展示了async/await语法的使用方式,包括异步函数的定义和执行流程。最后深入讲解了Tokio异步运行时的架构、安装配置方法,并提供了TCP服务器/客户端的实现示例,帮助开发者掌握Rust高性能网络应用的构建方法。

编程世界如山海,探索不止。 9679

002 Rust异步编程,async await简单介绍

此节对async/await做简单介绍,旨在让大家有一个简单的认识。 作用 async/.await是Rust编写异步的内置工具。async将一个代码块转化为实现了future特征的状态机。 那么,转化为future后有什么作用呢?答案:在同步方法中调用阻塞函数(async转化的函数)会阻塞整个线程,但是,阻塞的future会让出线程控制权,允许其它future运行。 部分语法 准备工作:配置文件Cargo.toml [dependencies] futures = "0.3.4" 创建异步函数

令狐一冲 1058

Rust异步编程性能优化10个技巧:async-book实战经验

Rust异步编程(async/await)通过高效的任务调度和非阻塞I/O,为构建高性能应用提供了强大支持。本文基于async-book项目的实战经验,总结10个实用性能优化技巧,帮助开发者充分发挥Rust异步编程的潜力,打造响应更快、资源利用率更高的应用程序。 ## 1. 合理选择并发模型:spawn vs join Rust异步编程提供了多种并发组合方式,选择合适的模型对性能至关重要。`f

gitblog_00507的博客 501

Comprehensive Rust 教程:Rust 异步编程的四大陷阱(阻塞执行器、Pin、Async Traits 与取消安全)

异步编程(`async`/`await`)为并发编程提供了便捷而高效的抽象,但 Rust 的 async/await 模型也自带一系列陷阱与"脚枪"(footguns)。本指南以 Google Android 团队维护的 Rust 课程 [Comprehensive Rust](https://link.gitcode.com/i/6d746f3ecc4b96f11f761b8c065c3dde)

gitblog_00915的博客 341

Rust Async Easy

async await join

SStringss的博客 523

Rust异步编程在leetcode-rust中的应用:fetcher模块深度解析

Rust异步编程在现代软件开发中扮演着重要角色,特别是在处理网络请求和并发任务时。本文将深入解析leetcode-rust项目中的fetcher模块,展示Rust异步编程如何优雅地解决LeetCode题目数据获取的挑战。这个开源项目为Rust开发者提供了学习和练习算法的高效工具。 ## 🚀 为什么需要异步编程? 在leetcode-rust项目中,fetcher模块负责从LeetCode官方

gitblog_00873的博客 449

苹果触控板 Windows Precision Touchpad 驱动安装指南:mac-precision-touchpad 快速上手

MacBook 装完 Windows 后,触控板往往只剩一个光标点:三指上滑没反应,双指滚动一卡一卡,蓝牙连着的 Magic Trackpad 用着用着就掉线。mac-precision-touchpad 是一个 Windows Precision Touchpad 驱动项目,把苹果触控板的多指手势、滚动和按压感应完整搬进 Windows 10,USB、SPI、蓝牙三种接口都有对应实现。 [![

gitblog_00951的博客 356
上一篇: Rust Async 异步编程(七):Stream 流处理
下一篇: Rust Async 异步编程(九):select!
UestcXiye
博客等级 码龄8年 9031粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值