#thread-local #async-context #worker-thread #lifetime #await #points #run-time

async-local

用于在异步上下文中和 await 点之间使用线程局部变量

16 个版本 (7 个稳定)

2.0.1 2024 年 3 月 24 日
2.0.0 2023 年 10 月 19 日
1.2.0 2023 年 3 月 27 日
0.15.4 2023 年 2 月 20 日
0.3.0 2022 年 11 月 30 日

#170并发

Download history 62/week @ 2024-04-08 41/week @ 2024-04-15 73/week @ 2024-04-22 45/week @ 2024-04-29 55/week @ 2024-05-06 68/week @ 2024-05-13 69/week @ 2024-05-20 66/week @ 2024-05-27 59/week @ 2024-06-03 92/week @ 2024-06-10 64/week @ 2024-06-17 56/week @ 2024-06-24 249/week @ 2024-07-01 94/week @ 2024-07-08 67/week @ 2024-07-15 327/week @ 2024-07-22

每月下载 738
4 个 Crates 中使用 (3 直接)

MIT 许可

19KB
332

Async Local

License Cargo Documentation

在异步上下文中释放线程局部变量的潜力

该crate允许在异步上下文中和 await 点之间或是在由Tokio运行时管理的阻塞线程中使用对线程局部变量的引用

工作原理

通过在运行时关闭期间使用障碍物来会合工作线程,可以保证没有任务会超过属于工作线程的线程局部数据。这样,由不变生命周期约束的线程局部变量的指针将保证具有适合在 await 点之间使用的有效生命周期。

运行时配置(可选)

为了获得最佳性能,使用通过 tokio::maintokio::test 宏配置的 Tokio 运行时,将 crate 属性设置为 async_local,同时 barrier-protected-runtime 功能在 async-local 上启用。这样做将配置 Tokio 运行时,在关闭期间以障碍物会合运行时工作线程,确保任务永远不会超过属于运行时工作线程的线程局部数据,从而无需使用 Box::leak 作为生命周期扩展的备用手段。

#[cfg(test)]*
mod tests {
  use std::sync::atomic::{AtomicUsize, Ordering};

  use async_local::{AsyncLocal, Context};
  use generativity::make_guard;
  use tokio::task::yield_now;

  thread_local! {
      static COUNTER: Context<AtomicUsize> = Context::new(AtomicUsize::new(0));
  }

  #[tokio::test(crate = "async_local", flavor = "multi_thread")]
  async fn it_increments() {
    make_guard!(guard);
    let counter = COUNTER.local_ref(guard);
    yield_now().await;
    counter.fetch_add(1, Ordering::SeqCst);
  }
}

依赖项

~0.3–27MB
~369K SLoC