13|独立王国:初步了解Rust异步并发编程
async rust
- 深入了解
- 翻译
- 解释
- 总结
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归属地:广东43 - 三过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归属地:北京21 - 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归属地:上海