3 个版本
0.1.1 | 2023 年 12 月 23 日 |
---|---|
0.1.0 | 2023 年 12 月 23 日 |
0.1.0-preview1 | 2023 年 12 月 18 日 |
#451 in 异步
17KB
278 代码行
概述
此 crate 提供了一个类似细胞类型的 FutureOnceCell
,它提供了与 tokio::task_local
相似的 API,但不需要使用任何宏。
Future local storage 将一个值关联到给定 future 的上下文。future 完成后,它将此值返回给调用者。这意味着值将通过执行 future 的上下文传递。此功能对于跟踪异步代码或向其添加度量很有用。
使用方法
use std::cell::Cell;
use future_local_storage::FutureOnceCell;
static VALUE: FutureOnceCell<Cell<u64>> = FutureOnceCell::new();
#[tokio::main]
async fn main() {
let (output, answer) = VALUE.scope(Cell::from(0), async {
VALUE.with(|x| {
let value = x.get();
x.set(value + 1);
});
"42".to_owned()
}).await;
assert_eq!(output.into_inner(), 1);
assert_eq!(answer, "42");
}
lib.rs
:
示例
跟踪跨度
// Usage example
async fn some_method(mut a: u64) -> u64 {
TracerContext::on_enter(format!("`some_method` with params: a={a}"));
// Some async computation
TracerContext::on_exit("`some_method`");
a * 32
}
#[tokio::main]
async fn main() {
let (trace, result) = TracerContext::in_scope(some_method(45)).await;
println!("answer: {result}");
println!("trace: {trace:#?}");
}
依赖项
~0.4–27MB
~348K SLoC