1 个不稳定版本
0.1.0 | 2024 年 6 月 11 日 |
---|
#339 在 并发
每月 38 次下载
14KB
144 行
原子兄弟计数器
此crate提供了一个共享计数器的实现,允许并行线程/任务检查它们有多少个'兄弟'。计数器是原子的,线程/任务之间没有任何同步或耦合。
这种计数器有用的实际例子是一个服务全局速率限制器。想象一个通过创建处理任务(例如,每个HTTP请求一个新处理任务)来处理请求的服务。在任务处理程序内部,你可能想知道有多少个处理程序正在并行运行('兄弟'),并调节或失败处理。在这种情况下,你通常不希望任务有任何同步点或竞争,也不希望显式处理计数器的生命周期。
使用此crate,通过保留一个 SiblingToken
来标记兄弟。该令牌可以被保留,例如,由线程处理程序、异步任务,或者甚至只是一个容器。在令牌上调用 sibling_count()
给出兄弟的总数。丢弃令牌会递减计数器。
你也可以通过持有具有 sibling_count()
方法的 SiblingCounter
来从外部观察你的兄弟。 SiblingCounter
实例不会被计入兄弟,但可以用来标记新的兄弟。兄弟计数器实例是可复制的,所有副本都引用相同的底层计数器。
你可以通过克隆现有令牌或在计数器上调用 add_sibling()
来标记新的兄弟(发布新的兄弟令牌)。
底层计数器只要至少有一个引用的 SiblingToken
或 SiblingCounter
实例存在,就会保持活动状态。
示例
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中的任何贡献,将如上双许可,不附加任何额外条款或条件。