Rust 语言从入门到实战
唐刚
Rust 语言中文社区联合创始人
5266 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 36 讲
Rust 语言从入门到实战
15
15
1.0x
00:00/00:00
登录|注册

13|独立王国:初步了解Rust异步并发编程

你好,我是 Mike。从今天开始,我们会用几节课的时间系统学习 Rust 异步并发编程。
和其他语言不大一样的是,异步 Rust(async Rust)相当于 Rust 世界里的一块儿新的王国,这个王国有一定的独立性,有它突出的特点。当然,独立并不代表封闭,我们前面所有的知识和经验仍然能顺利地在这个王国里发挥作用。

async rust

从 Rust v1.39 版本以后,Rust 引入了 async 关键字,用于支持异步编程的工程学体验,使程序员可以用已经习惯了的同步代码书写方式来编写异步代码。
如果你了解过早期的 JavaScript 语言,你可能会对回调模式以及“回调地狱”有所了解。感兴趣的话,你可以搜索“回调地狱”这个关键词,看看它是如何产生的,以及可以用什么方式去解决。
JavaScript 在 ECMAScript 2017 版本中引入了 async/await 关键字组合,用于改进 JavaScript 中异步编程体验,从此以后程序员可以用顺序的逻辑书写方式来写出异步执行的代码,而不是那种用回调方式把一段连续的逻辑切割成一小块一小块的。
Rust 其实也差不多,它用类似的方式引入了 async/.await 关键字对。如果你对 Mozilla 公司有所了解的话,就不会感觉奇怪了,Mozilla 是互联网标准组织的重要成员,JavaScript 之父就在 Mozilla 公司,参与了 JavaScript 标准制定的全过程。同时,Mozilla 还推出了 Rust 语言以及 WebAssembly 字节码规范。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

Rust异步并发编程是一门新的王国,引入了async关键字,使程序员可以用已经习惯了的同步代码书写方式来编写异步代码。文章介绍了async函数和块的定义方式,以及异步运行时的作用和原理。此外,还详细介绍了基于tokio runtime的代码范例,包括文件的读写操作、定时器操作等。通过文章,读者可以初步了解Rust异步并发编程的特点和基本使用方法。 Rust的异步代码与JavaScript的异步代码非常类似,只不过JavaScript的await关键字是放在语句前面的。tokio作为一个功能丰富、机制完善的Runtime框架,为Rust异步编程的生态打下了坚实的基础,通过几年的发展,一些上层建筑蓬勃发展起来了,比如HTTP协议Server和Client的实现、Web开发框架、GraphQL开发框架、gRPC框架的Rust实现等。 在底层机制方面,tokio的异步Runtime能力建立在操作系统的异步机制上,通过reactor接收消息事件并通知tokio waker唤醒对应的任务。tokio提供了一种合作式的任务模型,将所有的轻量级线程映射到具体的操作系统线程上来执行,实现了高效的抽象。这种合作式的轻量级线程可以在一台普通服务器上创建上百万个,相较于操作系统默认的线程机制,能够更高效地利用资源。 总的来说,本文介绍了Rust异步并发编程的基本概念和使用方法,以及tokio作为异步Runtime框架的特点和底层机制,为读者提供了对Rust异步编程的初步了解和认识。文章还介绍了tokio中创建和管理异步任务的方法,以及在编写异步代码时需要加入await的操作类型。文章最后对Async Rust和tokio的特点进行了总结,强调了它们在Rust生态中的重要性和优势。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Rust 语言从入门到实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(11)

  • 最新
  • 精选
  • Geek_e72251
    异步函数必须要.await得到返回结果才能够接着往下执行吗?那和同步函数有什么区别

    作者回复: 1。从程序员人体工学视角看,async/await 让我们好像在写顺序同步代码。 2。从cpu执行视角来看,await等待那个task进展的时候,cpu跑去执行其他task了。 这个在文章中有大段段落讲解。

    2023-11-26归属地:广东
    4
    3
  • 三过rust门而不入
    https://zhuanlan.zhihu.com/p/667313965#:~:text=Rust%20%E5%88%9D%E6%AD%A5%E4%BA%86%E8%A7%A3Rust%E5%BC%82%E6%AD%A5%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B%201%20async%20rust%20%E4%BB%8E%20Rust%20v1.39,%E5%87%BD%E6%95%B0%E5%89%8D%E5%B0%B1%E5%8F%AF%E4%BB%A5%E5%8A%A0%20async%20%E4%BF%AE%E9%A5%B0%E4%BA%86%E3%80%82%20...%207%20%E4%BB%A3%E7%A0%81%E7%A4%BA%E4%BE%8B%20...%20%E6%9B%B4%E5%A4%9A%E9%A1%B9%E7%9B%AE 被转载了唐老师,很多文章都转了

    编辑回复: 感谢反馈!!已经开始处理了🌹

    2024-01-11归属地:广东
    1
  • Joe Black
    如果启动了多个异步任务,不想挨着顺序await(因为有可能后面启动的提前结束),有没有办法实现等待一批任务并且其中一个任务完成就返回处理呢?处理后再去等待其它未完成的任务。

    作者回复: 好思考,后面会讲到这个

    2023-12-29归属地:北京
    1
  • 哄哄
    rust的命名其他都挺好,就是有时候难以一眼分清引入的是struct还是trait。他们都是首字母大写驼峰命名,而且,程序用到什么trait就需要引用什么trait,不像python里引用类就行了。

    作者回复: 对,这块儿没做区分,有时会搞混,不知道一个符号是struct还是trait。这块儿可以在自己项目中约定,比如 trait 都以Tr结尾。trait 的scope机制大家在开始时都不适应,后面应该ide能帮助提示。

    2023-11-17归属地:北京
    2
    1
  • Geek_3b58b9
    嵌入式系统中好像是用Embassy这个运行时的,既然运行时是依赖底层操作系统的,那嵌入式上用的这个运行时是基于什么的啊?

    作者回复: 运行时也可以裸机实现。 标准的桌面和server都是基于os的。

    2024-01-12归属地:江苏
  • superggn
    笔记: async runtime / 异步运行时 - async fn / async block 必须用 await 才能跑 - await 必须写在 async block / async fn 里 - main 不能是 async 的 => main 里头不能有 await => 那 main 里写啥来驱动 async fn / async block? - 这时就需要一个 async runtime / 异步运行时 - 简单来说就是一个可以写在 main 里的 await

    作者回复: 就是这个思路。

    2023-12-19归属地:北京
  • 哄哄
    请问,tokio::task::spawn和tokio::spawn的区别

    作者回复: 一样的,pub use而已

    2023-12-02归属地:北京
  • asdf100
    也就是说,在一个 task 没有遇到 .await 之前,它是不会主动交出这个 CPU 核的,其他 task 也不能主动来抢占这个 CPU 核。所以 tokio 实现的这个模型叫做合作式的。和它相对的,Go 语言自带的 Runtime 实现的 Goroutine 是一种抢占式的轻量级线程。 --- 这样如果一个task长期被执行,同一个cpu 上的其它 task将长期得不到执行,有失公平性的吗?go的抢占印象中就是解决这个不公平的问题

    作者回复: 是的,所以tokio还有spawn_blocking这个东西,专门用于这种阻塞式的任务。go是因为要统一一套机制,没办法,只能设计成抢占式,然而其实你对你要处理的业务一般是要预期的,rust这样更灵活。关于tokio的抢占式调度,也在构思中:https://docs.rs/tokio/latest/tokio/task/index.html#unconstrained

    2023-11-23归属地:上海
  • Geek_72807e
    请问老师,如果crateA为crateB1.1版本实现了一个trait,而我的项目中依赖了crateB1.0版本,那么这个trait会失效吗?还有,我奇怪的是如果一个struct的trait分散在各个crate中,怎么能让这些trait都生效呢……

    作者回复: 先回答第二个问题,得都use 到当前 crate中来。 第一个问题没懂什么意思哈。

    2023-11-17归属地:山西
    2
  • Apa琦
    tokio是完全使用操作系统的api实现的异步,那rust底层就没有提供异步的方法么。

    作者回复: 对的,rust没有内置async runtime

    2023-11-17归属地:上海
收起评论
显示
设置
留言
11
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部