分类: rust

16 篇文章

clap 笔记
1. ValueEnum 当我们需要使用自定义的枚举类型作为参数时,我们可以使用 clap::clap_derive::ValueEnum。 1.1 derive 方式 直接上例子: use clap::{clap_derive::ValueEnum, Parser}; #[derive(Debug, Clone, ValueEnum)] enum…
rust 笔记 10:axum 杂记
1. axum middleware axum crate 本身也有一些基础的 middleware 机制,在实现简单的逻辑时可以不用接入 tower。 1.1. 调用顺序 根据这篇文章的介绍,原生 axum middleware 的声明层级和调用顺序其实是反过来的,比较恶心。例如这么声明: use axum::{routing::get, Rou…
rust 笔记 9:cargo 杂记
1. 命令行运行特定单测 总有需要用命令行跑单测的场景,比如 vscode 上的 rust-analyzer 插件突然坏掉。。这个时候我们需要: cargo test --package my_project --bin test -- api::handler::test --show-output cargo test --package my…
杂谈:一些经验
1. 业务逻辑中的异步日志 在应用的初期版本,所有日志可能都是通过 tracing 输出到外部文件的,这是非常正常的情况;等到开始进行可观测能力建设后,就需要引入一些日志中间件,比如将一些重要日志输出到 SLS 。这些逻辑往往会穿插在我们业务函数中,于是就引出一个基本的原则:日志无论如何不能阻塞业务本身。(对于日志之外的非业务逻辑,其实也是一样的)…
rust 笔记 8:rust & tokio 杂记
1. 在 tokio::main 宏中指定 runtime 的线程个数 默认是多线程 runtime,worker 个数为 CPU 的核心数。可以通过在 tokio::main 中增加如下内容来制定 worker 个数: #[tokio::main(flavor = "multi_thread", worker_threads …
rust 笔记 7:新装机环境问题杂记
1. 换中科大镜像 rustup 安装方式不知从何时起被墙了 = = 换用国内镜像,加环境变量: export RUSTUP_DIST_SERVER=https://mirrors.ustc.edu.cn/rust-static export RUSTUP_UPDATE_ROOT=https://mirrors.ustc.edu.cn/rust-s…
rust 笔记 6:Notify vs oneshot::channel
1. 共性与区别 写异步 rust 时,我们经常需要一种一次性的通知手段,用于实现线程同步。tokio 提供了两种满足上述需求的同步工具:tokio::sync::oneshot::channel 和 tokio::sync::Notify。 二者主要有以下几点差距: 1.1. 单端与双端设计 对于 oneshot::channel ,自然地分为发…
rust 笔记 5:Pin 相关知识(极简总结版)
Pin 是一个结构 struct,Unpin 是一个特征 trait。 Pin 唯一的结构体成员就是一个指针(例如引用和 Box)。它能保证这个指针指向的数据不被移动。 Unpin 代表数据可以被安全地移动,!Unpin 代表数据不可以被安全移动。通常 !Unpin 的都是自引用类型。 如果一个 Unpin 类型的指针被放入 Pin 中,实际上没有…
pingora 笔记 1:连接池
1. 基本结构 入口类型 ConnectionPool 由一个 Hashmap pool 和一个 lru Lru 组成。 /// Connection pool /// /// [ConnectionPool] holds reusable connections. A reusable connection is released to this…
rust 笔记 4:彻底搞清楚各种字符串
1. String, &str 和 str 想要搞清楚这三者的差别,要从 str 开始说起。 1.1. str 和 &str str 是字符串切片(string slice),是对部分连续的 UTF8 字符序列的引用。 所有的切片类型,例如 str、[u8]、[i32] ,都是 Unsized 的(不定长类型,或称动态大小类型,Dy…