#once #async #value #set #container #shareable #watch

async-once-watch

异步且可共享的容器,其值只设置一次

1 个不稳定版本

0.1.1 2022年2月20日
0.1.0 2022年2月20日

#986并发

MIT 许可证

6KB
71

async-watch-once

[ crates.io | docs.rs ]

此 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