13 个版本
0.5.3 | 2023年7月9日 |
---|---|
0.4.4 | 2023年2月22日 |
0.4.2 | 2022年6月27日 |
0.3.0 | 2021年8月11日 |
#75 在 Rust 模式
119,541 每月下载量
在 125 个crate中使用 (直接使用 30)
60KB
788 行
概述
async_once_cell
是 once_cell 的一个版本,它增加了对单元格异步初始化的支持。API 的简短版本是
impl OnceCell<T> {
fn new() -> OnceCell<T>;
fn get(&self) -> Option<&T>;
async fn get_or_init(&self, init: impl Future<Output=T>) -> &T;
}
更多模式和用例请参阅 文档!
lib.rs
:
由 Future
创建的懒初始化值集合。
[OnceCell] 的 API 与 once_cell
crate、std::cell::OnceCell
或 std::sync::OnceLock
类似。它提供了一个只能初始化一次的单元格的异步版本,允许任务等待初始化,而不是竞争多个初始化任务。
与线程不同,任务可以在任何阻塞点被取消。[OnceCell] 通过允许另一个初始化器在当前初始化单元格的任务被丢弃时运行来处理这种情况。这也允许使用 OnceCell::get_or_try_init 进行可错误初始化,并允许初始化的 Future
包含对线程局部数据的借用或引用。
[Lazy] 采用相反的方法:它包装一个单个 Future
,由任何轮询任务协作运行至完成。这要求初始化函数独立于调用上下文,但不会因为周围任务被取消而重新启动初始化函数。对于未来可能通过使用特例对象 (Pin<Box<dyn Future>>
) 简化在数据结构中使用此类型。
开销
两个单元格都使用两个 usize
来存储状态,并且在初始化完成后不保留任何分配。只有在有竞争时才需要分配。
访问已初始化的单元格尽可能便宜:只需一次具有获取顺序的原子加载。
特性
critical-section
特性
如果启用此功能,将使用 critical-section
crate 而不是 std
互斥锁。您必须依赖于该crate并选择一个锁定实现;有关详细信息,请参阅其文档。
std
特性
目前这是一个无操作,但将来可能会用于公开仅在 std
中的类型的API。它不控制锁定实现。