1 个不稳定版本
0.1.1 | 2022年2月20日 |
---|---|
0.1.0 |
|
#986 在 并发 中
6KB
71 行
async-watch-once
此 crate 在 Rust 中提供了一个可共享的容器 OnceWatch<T>
,其值只设置一次。读取器以异步方式等待值准备就绪。
use async_once_watch::OnceWatch;
use async_std::task::{sleep, spawn};
use once_cell::sync::Lazy;
use std::time::Duration;
static STATE: Lazy<OnceWatch<u8>> = Lazy::new(OnceWatch::new);
let secret = 10;
/* Writer */
spawn(async move {
sleep(Duration::from_millis(500)).await;
// First write is fine
let ok = STATE.set(secret).is_ok();
assert!(ok);
// Second write is not allowed
let ok = STATE.set(secret).is_ok();
assert!(!ok);
});
/* Reader */
spawn(async move {
let received = *STATE.get().await;
assert_eq!(received, secret);
});
许可证
MIT 许可证。见 许可证文件。
lib.rs
:
异步且可共享的容器,其值只设置一次。
OnceWatch 是一个具有 get()
和 set()
方法的容器。值最多设置一次。读取器调用 get()
并等待值准备就绪。
use async_once_watch::OnceWatch;
use async_std::task::{sleep, spawn};
use once_cell::sync::Lazy;
use std::time::Duration;
static STATE: Lazy<OnceWatch<u8>> = Lazy::new(OnceWatch::new);
let secret = 10;
/* Writer */
spawn(async move {
sleep(Duration::from_millis(500)).await;
// First write is fine
let ok = STATE.set(secret).is_ok();
assert!(ok);
// Second write is not allowed
let ok = STATE.set(secret).is_ok();
assert!(!ok);
});
/* Reader */
spawn(async move {
let received = *STATE.get().await;
assert_eq!(received, secret);
});
依赖项
~2–3MB
~46K SLoC