Rust Async 异步编程(七):Stream 流处理

自己动手,丰衣足食------Rust实现自己的Stream 想写个简单的对象存储,折腾了两天大框写好了,结果一试,600M的稳健用了102秒,上网一查,这好像还不是个例, tokio::fs里面的东西好像普遍性能低下,而且低的不是一点半点。记得原来看的某篇文章里提过一句,说windows是有原生的异步磁盘操作的, linux下没有,不知道跟这个有没有关系。 想着用std::fs来替换,但是自己定的trait是围绕Stream来的,换的话等于推翻重写。思索在三,决定自己试着实现个Stream试一下。 先说Stream的定义: pub trait Stream 阅读详情

Rust Async 异步编程(七):Stream 流处理

Rust Async 异步编程(七):Stream 流处理

Stream trait 类似于 Future trait,但是前者在完成前可以生成多个值,这种行为跟标准库中的 Iterator trait 倒是颇为相似。

trait Stream {
    // Stream生成的值的类型
    type Item;

    // 尝试去解析Stream中的下一个值,
    // 若无数据,返回`Poll::Pending`, 若有数据,返回 `Poll::Ready(Some(x))`, `Stream`完成则返回 `Poll::Ready(None)`
    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>)
        -> Poll<Option<Self::Item>>;
}

关于 Stream 的一个常见例子是消息通道(futures 包中的)的消费者 Receiver。每次有消息从 Send 端发送后,它都可以接收到一个 Some(val) 值, 一旦 Send 端关闭(drop),且消息通道中没有消息后,它会接收到一个 None 值。

示例:

async fn send_recv() {
    const BUFFER_SIZE: usize = 10;
    let (mut tx, mut rx) = mpsc::channel::<i32>(BUFFER_SIZE);

    tx.send(1).await.unwrap();
    tx.send(2).await.unwrap();
    drop(tx);

    // `StreamExt::next` 类似于 `Iterator::next`, 但是前者返回的不是值,而是一个 `Future<Output = Option<T>>`,
    // 因此还需要使用`.await`来获取具体的值
    assert_eq!(Some(1), rx.next().await);
    assert_eq!(Some(2), rx.next().await);
    assert_eq!(None, rx.next().await);
}

跟迭代器类似,我们也可以迭代一个 Stream。 例如使用 map、filter、fold 方法,以及它们的遇到错误提前返回的版本:try_map、try_filter、try_fold。

但是跟迭代器又有所不同,for 循环无法在这里使用,但是命令式风格的循环 while let 是可以用的,同时还可以使用 next 和 try_next 方法:

async fn sum_with_next(mut stream: Pin<&mut dyn Stream<Item = i32>>) -> i32 {
    use futures::stream::StreamExt; // 引入 next
    let mut sum = 0;
    while let Some(item) = stream.next().await {
        sum += item;
    }
    sum
}

async fn sum_with_try_next(
    mut stream: Pin<&mut dyn Stream<Item = Result<i32, io::Error>>>,
) -> Result<i32, io::Error> {
    use futures::stream::TryStreamExt; // 引入 try_next
    let mut sum = 0;
    while let Some(item) = stream.try_next().await? {
        sum += item;
    }
    Ok(sum)
}

上面代码是一次处理一个值的模式,但是需要注意的是:如果你选择一次处理一个值的模式,可能会造成无法并发,这就失去了异步编程的意义。 因此,如果可以的话我们还是要选择从一个 Stream 并发处理多个值的方式,通过 for_each_concurrent 或 try_for_each_concurrent 方法来实现。

async fn jump_around(
    mut stream: Pin<&mut dyn Stream<Item = Result<u8, io::Error>>>,
) -> Result<(), io::Error> {
    use futures::stream::TryStreamExt; // 引入 `try_for_each_concurrent`
    const MAX_CONCURRENT_JUMPERS: usize = 100;

    stream.try_for_each_concurrent(MAX_CONCURRENT_JUMPERS, |num| async move {
        jump_n_times(num).await?;
        report_n_jumps(num).await?;
        Ok(())
    }).await?;

    Ok(())
}

参考:

  1. https://github.com/rustcn-org/async-book
  2. https://www.bilibili.com/video/BV1Ki4y1C7gj
《Rust 程序设计语言》第十七章:异步编程基础:Async、Await、Future 与 Stream 本文介绍了Rust异步编程的核心概念,包括Future、Stream、async/await语法及其应用场景。主要内容包括: 基础概念:异步编程通过Future和Stream实现并发,async/await语法简化异步代码编写。Future表示未来可能就绪的值,Stream是异步版的迭代器。 关键工具: async标记可暂停的代码块 await等待异步操作完成 运行时(runtime)管理异步任务执行 join/race等组合器处理多个Future 典型应用: 网络请求并发处理 消息通道实现任务间通信 流式 阅读详情

相关推荐

input-stream:RUST的输入流类似于C ++的* fstreams

input-stream:RUST的输入流类似于C ++的* fstreams

RUST:异步流处理Stream

Stream 特质 在同步Rust 中流的核心是Iterator 提供了一种在序列中产生项的方法,并在它们之间进行阻塞,通过迭代器传递给其他迭代器 在异步Rust中流的核心Stream, 允许其他任务在当前阻塞等待时允许 Read/Write, AsyncRead/AsyncWrite fn main() { let f = file::create("E:\\foot.txt").await?; f.write_all(b"hello world").await?; let

上后谈感情的博客 1618

【Nordic实战】nRF54L15引脚规划:电源域、专用引脚与低功耗设计避坑指南

本文深入解析Nordic nRF54L15芯片的引脚规划策略,重点阐述其基于电源域(MCU域、PERI域、LP域)的GPIO分配原则。文章提供了从思维转变到实战避坑的完整指南,强调遵循专用引脚与域对应关系是实现超低功耗设计的关键,并分享了系统化的引脚规划流程与工具使用建议。

weixin_29192141的博客 322

rust中的Stream和Future

Future是一个包含一个pollpoll方法:检查Future是否已经完成。如果完成,返回,否则返回。Output类型:表示Future完成时的返回值类型。Stream是一个包含一个poll_nexttype Item;poll_next方法:检查Stream是否有新的数据。如果有,返回,如果流结束,返回,否则返回。Item类型:表示Stream中产生的值的类型。Future:表示将来可能完成的异步计算,通过poll方法检查是否完成。Stream:表示异步的数据流,通过。

SteveForever的博客 711

【深度学习】肺结节分割项目实战一:处理数据集

一、LIDC-IDRI数据集简介 官方网站 肺图像数据库协会的图像收集(LIDC-IDRI)包括诊断和带有病变注释标记的肺癌筛查胸部CT。这是一个网络公开的国际资源,用于肺癌检测和诊断的计算机辅助诊断(CAD)方法的开发、培训和评估。 数据集包含1018个病例,每个病例包括来自临床胸部CT扫描的图像和一个相关的XML文件,该文件记录了由四名经验丰富的胸部放射科医生进行的两阶段图像注释过程的结果。在最初的盲读阶段,每个放射科医生独立审查每个CT扫描,并标记出属于三种类型之一的病变(“结节>= 3mm”,

weixin_42182906的博客 1万+

告别代码恐惧!用KRobot图形化编程,10分钟搞定Arduino巡线小车(附完整接线图)

本文介绍如何使用KRobot图形化编程工具快速搭建Arduino巡线小车,无需编写代码。从硬件准备到逻辑构建,详细讲解传感器数据处理、电机控制优化及高级功能扩展,帮助教育工作者和创客爱好者10分钟内完成项目。

weixin_30632089的博客 396

147、掌握Rust异步编程:Future、Stream与Tokio实战

本文深入探讨了Rust语言的异步编程高级特性,重点介绍了Future、Stream等异步编程概念,并学会了使用Tokio库进行异步任务管理和调度。通过实际应用场景和实用技巧的示例,我们了解了异步编程在网络请求和数据流处理等方面的广泛应用。文章还强调了异步编程的最佳实践,如使用async/await语法、异步错误处理、避免过多的异步任务和使用Stream进行流式传输等。希望本文能够为读者提供一个良好的起点,让大家更好地掌握Rust的异步编程,并在实际项目中发挥出它的巨大潜力。

silenceallat的博客 1774

[FreeRTOS+STM32CubeMX] 03 USART串口调试-基于中断实现接收和发送数据

我们接着上一小节,上一节讲到,接收上位机传来的数据时,需要事先知道传来的数据的字节数,这一操作实在有些反人类,那么如何解决这个问题,上位机输入多少,我们就接收多少数据呢? 接下来我将把USART引入中断,在接收数据的回调函数中引入二值信号量、消息队列,来让我的接收数据能够存储在队列中,并一个一个的在任务中输出出来,并最终在上位机回显。

RichieHuang的博客 2650

006 Rust 异步编程,Stream 介绍

Stream 介绍 Stream和Future类似,但是Future对应的是一个item的状态的变化,而Stream则是类似于iterator,在结束之前能够得到多个值。或者我们可以简单的理解为,Stream是由一系列的Future组成,我们可以从Stream读取各个Future的结果,直到Stream结束。 Stream trait定义 定义如下: trait Stream { type Item; fn poll_next(self: Pin<&mut Self>,

令狐一冲 1212

基于 Go 的微信滑块验证码自动化:协议还原与图像算法深度解析

本文从协议层、算法层和工程优化三个维度,系统拆解了基于Go的微信滑块验证码自动化方案。在协议层,通过手写protobuf编码器和RSA加密复现了微信UUID生成机制;在算法层,采用图像匹配技术实现滑块缺口定位;在工程层面,构建了包含HTTP状态机和随机化设备指纹的完整验证流程。文章重点阐述了技术实现的形式化建模、算法选择依据和复杂度分析,为工程师和算法研究者提供了可验证的技术方案。核心代码结构包括UUID生成、滑块状态机和图像匹配算法等模块,通过分层设计实现了高效可靠的验证码自动化破解。

weixin_65409651的博客 1294

1、深入解析OTA/gm - C滤波器架构与设计

本文深入探讨了OTA/gm-C滤波器的架构与设计方法,涵盖了从基本构建模块到高阶滤波器实现的多种技术。重点分析了双积分器环路结构(如Tow-Thomas和KHN滤波器)的工作原理、性能特点及OTA非理想特性对滤波器的影响,并介绍了降低寄生效应、提升动态范围的方法。文章还讨论了基于LC梯形仿真、多环反馈和电流模式的gm-C滤波器设计,以及自动调谐技术在频率稳定性中的应用。最后总结了不同类型gm-C滤波器的优缺点及其适用场景,为高频集成连续时间滤波器的设计提供了全面的技术参考。

fanta的博客 187

Rust异步编程进阶:Future手动实现、Stream与异步安全

本文深入探讨了Rust异步编程的高级主题,包括手动实现Future、处理异步数据流(Stream)以及异步安全等核心概念。文章首先讲解了手动实现Future的必要性和具体步骤,包括定义Future结构体、实现Future trait、处理自引用结构体(Pin)以及组合多个Future。然后介绍了异步Stream的概念和实现方法,强调其与Iterator的相似性但操作是异步的。这些高级技术对于调试异步代码、性能优化、实现自定义异步操作以及深入理解Rust异步原理都具有重要意义。

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

【YOLOs-CPP-图像分类部署】04-项目优化(加速部署)

本文详细介绍了将YOLO图像分类C++部署项目从CMake迁移到Visual Studio控制台应用的全过程。针对低配CPU性能瓶颈问题,作者通过替换多线程HPP代码为官方实现,并采用448x448固定输入尺寸优化推理速度。项目配置包含OpenCV和ONNX Runtime环境设置,实现了图像批量处理、分类结果显示及结果日志输出功能。关键步骤包括依赖库配置、DLL部署和代码调试,最终在Windows平台成功实现高效CPU推理。该方案显著提升了低配硬件的兼容性,为图像分类任务提供了稳定的部署解决方案。

深耕CV 355

Rust By Practice 异步编程实战:从 async/await 到 Future、Pin 与 Stream 的完整路径

Rust By Practice 是一本面向 Rust 新手与进阶开发者的实战练习书,其异步编程章节系统覆盖了 async/await 语法、Future 机制、Pin 与 Unpin 以及 Stream 流处理四大核心主题。本书采用"示例 + 大量练习 + 实战项目"的练习驱动模式,帮助你从零开始真正掌握 Rust 异步编程,而不仅仅是停留在概念层面。 [![Rust By Practice

gitblog_00641的博客 407

镜头调焦的 调整的是焦距还是像距?

在镜头 “调焦”(即日常拍照时的)中,调整的核心是,而非焦距。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 1353

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

async-stream:Rust异步流编程的终极指南与快速入门

**async-stream** 是 Rust 生态中一款强大的异步流处理库,它让开发者能够使用直观的 `async & await` 语法创建和操作异步流,极大简化了异步数据序列的处理逻辑。无论是处理网络连接、文件流还是实时数据,async-stream 都能提供简洁高效的解决方案,帮助开发者轻松构建响应式应用。 ## 🚀 为什么选择 async-stream?异步流编程的核心优势 在 R

gitblog_00474的博客 1038

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

异步编程革命:Rust async/await完全指南

异步编程革命:Rust async/await完全指南 本文深入探讨了Rust异步编程的核心机制,从Future执行模型与任务调度机制、Pin和Unpin的内存安全原理,到Stream流处理与多Future并发技术,最后通过异步Web服务器实战开发展示完整应用。文章详细解析了Rust异步编程的底层实现原理和高级应用技巧,为开发者提供从基础到实战的完整指南。 Future执行模型与任务调度机制 在R...

gitblog_00027的博客 1262

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

如何用async-stream简化Rust异步流处理:10个实用技巧

在Rust的异步编程世界中,处理数据流往往需要复杂的状态管理和迭代逻辑。**async-stream**库通过提供直观的`async`/`await`语法糖,让开发者能够以声明式方式构建异步流,大幅降低了异步数据流处理的复杂度。本文将分享10个实用技巧,帮助你快速掌握async-stream的核心用法,提升Rust异步编程效率。 ## 1. 快速创建基础异步流:掌握`stream!`宏的基本用法

gitblog_00982的博客 792

快速入门futures-await:5分钟掌握Rust异步编程新语法

想要在Rust中编写简洁优雅的异步代码吗?futures-await正是你需要的终极解决方案!这个强大的库为Rust带来了async/await语法,让异步编程变得像同步代码一样简单直观。无论你是Rust新手还是经验丰富的开发者,只需5分钟就能掌握这种革命性的异步编程新语法。✨ ## 什么是futures-await? futures-await是一个Rust异步编程库,它通过`#[async

gitblog_00309的博客 772

async-stream核心原理深度解析:从yield到Stream的魔法实现

你是否曾经想过,在Rust的异步编程中,如何像使用生成器一样优雅地创建流?今天,我将为你深入解析**async-stream**这个强大的异步流库的核心原理。通过本文,你将理解从简单的`yield`关键字到完整的`Stream`实现的魔法转换过程!🚀 ## 什么是async-stream? **async-stream**是一个Rust库,它允许你使用`async`和`await`语法来创建

gitblog_00596的博客 824

futures-await高级用法:async_stream与流处理完全解析

futures-await是Rust异步编程生态中的重要工具,其中**async_stream**提供了简洁高效的异步流处理能力,让开发者能够轻松创建和操作异步数据流。本文将深入解析async_stream的高级用法,帮助你掌握异步流处理的核心技巧。 ## 什么是async_stream? **async_stream**是futures-await提供的一个强大宏,它允许你使用类似生成器的语

gitblog_00428的博客 615

Rust异步编程深度解析

使用async关键字定义异步函数,异步函数返回一个Future} else {// 通知executor再次轮询println!Rust的异步编程是一种强大的编程范式,它可以帮助我们更高效地处理I/O操作,提高程序的性能和响应速度。通过语法和Futuretrait,我们可以编写清晰、简洁的异步代码。作为一名从后端开发转向Rust的开发者,我发现Rust的异步编程与Python的异步编程有很多相似之处,但也有一些不同。

no1coder的博客 4856

【跟小嘉学 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

async-stream未来路线图:Stream Trait与async/await演进

async-stream是Rust生态中一个强大的异步流处理库,它利用async & await语法为开发者提供了简洁高效的异步流构建方案。随着Rust语言异步生态的不断发展,async-stream也在持续演进,致力于提供更完善的Stream Trait支持和更优化的async/await集成体验。 ## 🚀 核心功能现状与技术基石 async-stream目前的核心能力建立在对Rust标

gitblog_07314的博客 349

futures-await源码剖析:探索Rust异步编程的早期实现

futures-await是Rust异步编程发展历程中的重要探索项目,它为Rust开发者提供了早期的async/await语法支持,是现代Rust异步生态系统的重要基石。本文将深入剖析futures-await的源码结构与核心实现,帮助开发者理解Rust异步编程模型的演进过程。 ## 项目核心架构解析 futures-await项目采用模块化设计,主要包含三大核心组件: - **运行时支持库

gitblog_01150的博客 803

探索 Rust 流处理的艺术:Awesome Rust Streaming

探索 Rust 流处理的艺术:Awesome Rust Streaming 在编程的世界中,Rust 已经以其强大的性能、内存安全和并发性赢得了开发者们的广泛赞誉。而 是一个精心收集的资源库,它为 Rust 开发者们提供了一站式的流处理解决方案。这篇文章将深入探讨该项目的核心价值,并展示其如何帮助你提升流数据处理的能力。 项目简介 Awesome Rust Streaming 是一个 GitH...

gitblog_00035的博客 1168
上一篇: Rust Async 异步编程(六):Pin 和 Unpin
下一篇: Rust Async 异步编程(八):join!
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、付费专栏及课程。

余额充值