前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Rust学习笔记Day24 常用库及生态领域

Rust学习笔记Day24 常用库及生态领域

作者头像
用户1072003
发布2023-02-23 17:02:26
1.5K0
发布2023-02-23 17:02:26
举报
文章被收录于专栏:码上读书码上读书

变成语言对外展现出来的能力是:语言 + 生态 的合集。,生态可以弥补语言的劣势。

像Golang 借助微服务和云原生的春风,构建了强大的生态系统。Python在数据分析和机器学习,构建了简洁实用的生态系统。

Rust的库可以到 crates.io 去找。

基础库

先介绍一下,应用开发中可能用到的库。

先按照重要程度依次简单说一下,方便你根据需要自行跳转:

  • 序列化和反序列化工具 serde、
  • 网络和高性能 I/O 库 tokio
  • 用于错误处理的 thiserror 和 anyhow
  • 用于命令行处理的 clap 以及其他
  • 用于处理异步的 futures 和 async-trait
  • 用于提供并发相关的数据结构和算法的 crossbeam
  • 以及用于撰写解析器的 nom 及其他

serde

只需要在数据结构上使用 #[derive(Serialize, Deserialize)] 宏,你的数据结构就能够被序列化和反序列化成绝大多数格式:JSON / YAML / TOML / MsgPack / CSV / Bincode 等等。

如果用过其它语言的 ORM,那么,可以把 serde 理解成增强版的、普适性的 ORM,它可以把任意可序列化的数据结构,序列化成任意格式,或者从任意格式中反序列化。

我理解所谓序列化换句话来说,就是将一种文本结构转化成另外一种文本结构。比如从json文本结构,转化成我们自定义的数据类型的文本结构。

那么什么不是“可序列化的数据结构”呢?很简单,任何状态无法简单重建的数据结构,比如一个 TcpStream、一个文件描述符、一个 Mutex,是不可序列化的,而一个 HashMap<String, Vec> 是可序列化的。

tokio

如果你要用 Rust 处理高性能网络,那么 tokio 以及 tokio 的周边库,必须了解。

tokio 在 Rust 中的地位,相当于 Golang 处理并发的运行时,只不过 Golang 的开发者没法选择用不用运行时,

而 Rust 开发者可以不用任何运行时,或者在需要的时候有选择地引入 tokio / async-std / smol 等。

thiserror / anyhow

错误处理的两个库 thiserror / anyhow 建议掌握,目前 Rust 生态里它们是最主流的错误处理工具。

clap / structopt / dialoguer / indicatif

clap 和 structopt 依旧是 Rust 命令行处理的主要选择,其中 clap 3 已经整合了 structopt。所以,一旦它发布正式版本,structopt 的用户可以放心切换过去。

如果你要做交互式的命令行,dialoguer 是一个不错的选择。如果你希望在命令行中还能提供友好的进度条,试试 indicatif。

futures/async-trait

标准库中已经采纳了 futures 库的 Future trait,并通过 async/await 关键字,使异步处理成为语言的一部分。然而,futures 库中还有很多其它重要的 trait 和数据结构,比如我们之前使用过的 Stream / Sink。futures 库还自带一个简单的 executor,可以在测试时取代 tokio。

async-trait 库顾名思义,就是为了解决 Rust 目前还不支持在 trait 中带有 async fn 的问题。

crossbeam

这是 Rust 下一个非常优秀的处理并发,以及和并发相关的数据结构的库。当你需要撰写自己的调度器时,可以考虑使用 deque。当你需要性能更好的 MPMC channel 时,可以使用 channel。当你需要一个 epoch-based GC 时,可以使用 epoch。

nom/pest/combine

这是三个非常优秀的 parser 库,可以用来撰写高效的解析器。在 Rust 下,当你需要处理某些文件格式时:首先可以考虑 serde。其次可以考虑这几个库;如果你要处理语法,那么它们是最好的选择。

Web开发

从 Web 协议支持的角度看:
  • hyper 处理 http1/http2,
  • quinn / quiche 处理 QUIC/http3,
  • tonic 处理 gRPC,
  • tungstenite / tokio-tungstenite 处理 websocket。
从协议序列化 / 反序列化的角度看:
  • avro-rs 处理 apache avro,capnp 处理 Cap’n Proto。
  • prost 处理 protobuf,flatbuffers 处理 google flatbuffers。
  • thrift 处理 apache thrift,以及 serde_json 处理我们最熟悉的 JSON。
从 Web 框架的角度看:
  • 有号称性能宇宙第一的 actix-web;
  • 有简单好用且即将支持异步,性能会大幅提升的 rocket;
  • 还有 tokio 社区刚刚发布没多久的后起之秀 axum。
从数据库的支持角度看:

Rust 支持几乎所有主流的数据库,包括但不限于: MySQL、Postgres、Redis、RocksDB、Cassandra、MongoDB、ScyllaDB、CouchDB 等等。

如果你喜欢使用 ORM,可以用 diesel,或者 sea-orm。如果你享受直接但安全的 SQL 查询,可以使用 sqlx。

客户端开发

areweguiyet.com 页面中,我们可以看到大量的 GUI 库。我个人觉得比较有前景的跨平台解决方案是 tauri、druid、iced 和 sixtyfps。

tauri 是 electron 的替代品,如果你厌倦了 electron 庞大的身躯和贪婪的内存占用,但又喜欢使用 Web 技术栈构建客户端 GUI,那么可以试试 tauri,它使用了系统自身的 webview,再加上 Rust 本身极其克制的内存使用,性能和内存使用能甩 electron 好几个身位。我就是因为要用tauri开发,才学习的rust。

剩下三个都是提供原生 GUI,其中 sixtyfps 是一个非常不错的对嵌入式系统有很好支持的原生 GUI 库,不过要注意它的授权是 GPLv3,在商业产品上要谨慎使用(它有商业授权)。

云原生开发

这不是一直都是Golang的天下吗?Rust也要染指这一块了吗?

作者时候Rust 在这个领域渐渐有冒头的趋势。这要感谢之前提到的 serde,以及处理 Kubernetes API 的 kube-rs 项目做出的巨大努力,还有 Rust 强大的宏编程能力,它使得我们跟 Kubernetes 打交道无比轻松。

虽然在云原生方面,Rust 还是个弟弟,但这个弟弟有着强大的降维打击能力。

同样的功能,Rust 可以只用 Golang 大概 1/4-1/10 的代码完成功能,这得益于 Rust 宏编程的强大能力。

WebAssembly开发

WebAssembly 是 Rust 主战场之一。Rust 内置了 wasm32-unknown-unknown 作为编译目标,如果你没添加,可以用 rustup 添加,然后在编译的时候指明目标,就可以得到 wasm:

代码语言:javascript
复制

$ rustup target add wasm32-unknown-unknown
$ cargo build --target wasm32-unknown-unknown --release

你可以用 wasm-pack 和 wasm-bindgen,不但生成 wasm,同时还生成 ts/js 调用 wasm 的代码。你可以在 rustwasm 下找到更多相关的项目。

嵌入式开发

如果你要用 Rust 做嵌入式开发,那么 embedded WG 不可不关注。

你也可以在 Awesome embedded rust 里找感兴趣的嵌入式开发工具。现在很多嵌入式开发其实不是纯粹的嵌入式设备开发,所以云原生、边缘计算、WebAssembly 也在这个领域有很多应用。比如被接纳为 CNCF sandbox 项目不久的 akri,它就是一个管理嵌入式设备的云原生项目。

机器学习开发

机器学习 / 深度学习是 Rust 很有潜力,但目前生态还很匮乏的领域。

Rust 有 tensorflow 的绑定,也有 tch-rs 这个 libtorch(PyTorch)的绑定。除了这些著名的 ML 库的 Rust 绑定外,Rust 下还有对标 scikit-learn 的 linfa。

小结

我的天呐,今天才知道 Rust可以用在这么多方向上。目前主要用在WebAssembly领域。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2023-02-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 码上读书 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础库
    • tokio
      • thiserror / anyhow
        • clap / structopt / dialoguer / indicatif
          • futures/async-trait
            • crossbeam
              • nom/pest/combine
                • Web开发
                  • 客户端开发
                    • 云原生开发
                      • WebAssembly开发
                        • 嵌入式开发
                          • 机器学习开发
                          • 小结
                          相关产品与服务
                          文件存储
                          文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
                          领券
                          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档