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 |
|
#170 在 并发
每月下载 738 次
在 4 个 Crates 中使用 (3 直接)
19KB
332 行
Async Local
在异步上下文中释放线程局部变量的潜力
该crate允许在异步上下文中和 await 点之间或是在由Tokio运行时管理的阻塞线程中使用对线程局部变量的引用
工作原理
通过在运行时关闭期间使用障碍物来会合工作线程,可以保证没有任务会超过属于工作线程的线程局部数据。这样,由不变生命周期约束的线程局部变量的指针将保证具有适合在 await 点之间使用的有效生命周期。
运行时配置(可选)
为了获得最佳性能,使用通过 tokio::main 或 tokio::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