#计数器 #兄弟 #原子 #arc

atomic_sibling_counter

一个共享计数器,允许并行线程/任务检查它们有多少个兄弟。计数器是原子的,线程/任务之间没有任何同步或耦合。

1 个不稳定版本

0.1.0 2024 年 6 月 11 日

#339并发

每月 38 次下载

MIT/Apache

14KB
144

原子兄弟计数器

此crate提供了一个共享计数器的实现,允许并行线程/任务检查它们有多少个'兄弟'。计数器是原子的,线程/任务之间没有任何同步或耦合。

这种计数器有用的实际例子是一个服务全局速率限制器。想象一个通过创建处理任务(例如,每个HTTP请求一个新处理任务)来处理请求的服务。在任务处理程序内部,你可能想知道有多少个处理程序正在并行运行('兄弟'),并调节或失败处理。在这种情况下,你通常不希望任务有任何同步点或竞争,也不希望显式处理计数器的生命周期。

使用此crate,通过保留一个 SiblingToken 来标记兄弟。该令牌可以被保留,例如,由线程处理程序、异步任务,或者甚至只是一个容器。在令牌上调用 sibling_count() 给出兄弟的总数。丢弃令牌会递减计数器。

你也可以通过持有具有 sibling_count() 方法的 SiblingCounter 来从外部观察你的兄弟。 SiblingCounter 实例不会被计入兄弟,但可以用来标记新的兄弟。兄弟计数器实例是可复制的,所有副本都引用相同的底层计数器。

你可以通过克隆现有令牌或在计数器上调用 add_sibling() 来标记新的兄弟(发布新的兄弟令牌)。

底层计数器只要至少有一个引用的 SiblingTokenSiblingCounter 实例存在,就会保持活动状态。

示例

use atomic_sibling_counter::SiblingCounter;
use std::time::Duration;

let counter = SiblingCounter::new();

for _ in 0..10 {
    let token = counter.add_sibling(); // new sibling token, to be moved into a spawned thread
    std::thread::spawn(move || {
        std::thread::sleep(Duration::from_secs(1)); // let all threads start

        // each thread now knows how many siblings it has
        assert_eq!(token.sibling_count(), 10);

        std::thread::sleep(Duration::from_secs(1)); // stay alive for a bit
    });
}

// from the main thread, we can check how many sibling threads there are
assert_eq!(counter.sibling_count(), 10);

std::thread::sleep(Duration::from_secs(5)); // let all threads finish
assert_eq!(counter.sibling_count(), 0);

许可证

根据您的选择,许可协议为Apache License,Version 2.0或MIT许可。

除非您明确表示,否则根据Apache-2.0许可证定义的,您有意提交以包含在此crate中的任何贡献,将如上双许可,不附加任何额外条款或条件。

无运行时依赖