陈天 · Rust 编程第一课
陈天
Tubi TV 研发副总裁
23195 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 65 讲
基础篇 (21讲)
陈天 · Rust 编程第一课
15
15
1.0x
00:00/00:00
登录|注册

40|异步处理:如何处理异步IO?

兼容性处理
例子
unfold()
poll_fn()
repeat_with()
repeat()
pending()
once()
empty()
实现异步IO接口
异步IO接口
实现Stream
生成Stream
Iterator vs Stream
思考题
小结
实现Sink trait
Sink trait定义
实现异步IO接口
异步IO接口的兼容性处理
Stream trait
Sink trait
异步IO
异步处理

该思维导图由 AI 生成,仅供参考

你好,我是陈天。
前面两讲我们学习了异步处理基本的功能和原理(Future/async/await),但是还没有正式介绍在具体场合下该用哪些工具来处理异步 IO。不过之前讲 trait 的时候,已经了解和使用过一些处理同步 IO 的结构和 trait。
今天我们就对比同步 IO 来学习异步 IO。毕竟在学习某个新知识的时候,如果能够和头脑中已有的知识联系起来,大脑神经元之间的连接就会被激活,学习的效果会事半功倍。
回忆一下同步环境都有哪些结构和 trait 呢?首先,单个的值可以用类型 T 表述,一组值可以用 Iterator trait 表述;同步 IO,我们有标准的 Read/Write/Seek trait。顾名思义,Read/Write 是进行 IO 的读写,而 Seek 是在 IO 中前后移动当前的位置。
那么异步呢?我们已经学习到,对于单个的、在未来某个时刻会得到的值,可以用 Future 来表示:
但还不知道一组未来才能得到的值该用什么 trait 来表述,也不知道异步的 Read/Write 该是什么样子。今天,我们就来聊聊这些重要的异步数据类型。

Stream trait

首先来了解一下 Iterator 在异步环境下的表兄弟:Stream。
我们知道,对于 Iterator,可以不断调用其 next() 方法,获得新的值,直到 Iterator 返回 None。Iterator 是阻塞式返回数据的,每次调用 next(),必然独占 CPU 直到得到一个结果,而异步的 Stream 是非阻塞的,在等待的过程中会空出 CPU 做其他事情
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

异步IO在编程中的重要性以及其处理方式是本文的重点。文章通过对比同步IO和异步IO的特点,引出了Stream trait的概念,作为Iterator在异步环境下的对应物,提供了非阻塞式的数据流处理方式。详细介绍了Stream trait的定义和使用方法,并通过代码示例展示了Stream和Iterator的相似之处。此外,还介绍了生成Stream的方法,包括使用futures库提供的基本方法以及为数据结构实现Stream trait的方式。最后,通过一个实际的例子展示了如何将异步IO的接口封装成Stream,并为其实现Stream trait。文章还探讨了Rust的异步IO trait的分裂现象以及异步IO接口的兼容性处理。整体而言,本文为读者提供了清晰的概念和实际操作指南,是一篇深入浅出的技术文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《陈天 · Rust 编程第一课》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(7)

  • 最新
  • 精选
  • 乌龙猹
    2021年就剩下最后一个月 陈老师的课也即将完结 所幸2021年跟随陈老师的课程对 rust 有了一个初步的了解 希望来年能用rust 做点啥 提前预定老师的 elixir 课程

    作者回复: 👍

    2021-12-01
    4
  • 罗同学
    还是没搞懂这几个接口的意义,我在绿色线程里用同步的形式处理io,然后再通过channel 等方式分享出去数据,不是也可以吗?这几个异步io的接口是不是有点多余?或者是什么场景下使用?

    作者回复: > 在绿色线程里用同步的形式处理io 那就会在等待 IO 的时候导致阻塞,进而让「绿色线程」所在的线程无法在等待 IO 时做其它事情。

    2021-12-01
    2
    3
  • worm
    为什么要用sink trait,直接使用asyncWrite有什么不好吗,没搞懂
    2022-01-28
    1
  • Rex Wang
    回答一下上边 trait Sink 和 trait AsyncWrite 的区别,结合下一讲可以看出。Sink 是有一个泛型 Item 的抽象的,也就是可以把任意类型“写”入;而 AsyncWrite 只作用于 [u8].
    2022-11-25归属地:北京
  • overheat
    Stream好像已经稳定下来了,没有看到nightly的提示了
    2022-09-04归属地:美国
  • Geek_676746
    AsyncRead 是第三方的trait,没必要讨论吧
    2022-04-05
  • 良师益友
    从这篇开始,变得超难
    2021-12-07
收起评论
显示
设置
留言
7
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部