40|异步处理:如何处理异步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
《陈天 · Rust 编程第一课》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(7)
- 最新
- 精选
- 乌龙猹2021年就剩下最后一个月 陈老师的课也即将完结 所幸2021年跟随陈老师的课程对 rust 有了一个初步的了解 希望来年能用rust 做点啥 提前预定老师的 elixir 课程
作者回复: 👍
2021-12-014 - 罗同学还是没搞懂这几个接口的意义,我在绿色线程里用同步的形式处理io,然后再通过channel 等方式分享出去数据,不是也可以吗?这几个异步io的接口是不是有点多余?或者是什么场景下使用?
作者回复: > 在绿色线程里用同步的形式处理io 那就会在等待 IO 的时候导致阻塞,进而让「绿色线程」所在的线程无法在等待 IO 时做其它事情。
2021-12-0123 - worm为什么要用sink trait,直接使用asyncWrite有什么不好吗,没搞懂2022-01-281
- Rex Wang回答一下上边 trait Sink 和 trait AsyncWrite 的区别,结合下一讲可以看出。Sink 是有一个泛型 Item 的抽象的,也就是可以把任意类型“写”入;而 AsyncWrite 只作用于 [u8].2022-11-25归属地:北京
- overheatStream好像已经稳定下来了,没有看到nightly的提示了2022-09-04归属地:美国
- Geek_676746AsyncRead 是第三方的trait,没必要讨论吧2022-04-05
- 良师益友从这篇开始,变得超难2021-12-07
收起评论