#future #local-storage #thread-local #thread-local-storage #value #tracing #cell

future-local-storage

为线程局部值创建一次初始化的 Future 细胞

3 个版本

0.1.1 2023 年 12 月 23 日
0.1.0 2023 年 12 月 23 日
0.1.0-preview12023 年 12 月 18 日

#451 in 异步

MIT 许可证

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