4 个版本
0.1.3 | 2024 年 5 月 10 日 |
---|---|
0.1.2 | 2024 年 5 月 10 日 |
0.1.1 | 2024 年 5 月 10 日 |
0.1.0 | 2024 年 5 月 10 日 |
在 并发 中排名第 378
每月下载量 47 次
13KB
244 代码行
atomic-waitgroup
支持异步的高级功能的 waitgroup,通过原子操作实现以减少锁定。
特性
-
支持 wait_to() 等待大于零的值。
-
wait() 和 wait_to() 可以通过 tokio::time::timeout 或 futures::select! 取消。
-
假设只有一条线程调用 wait()。如果检测到多个并发 wait(),将因无效使用而引发 panic。
-
除了调用 wait() 的协程外,还可以由多个协程调用 done()。
lib.rs
:
支持异步的高级功能的 waitgroup,通过原子操作实现以减少锁定。
特性与限制
-
支持 wait_to() 等待大于零的值。
-
wait() 和 wait_to() 可以通过 tokio::time::timeout 或 futures::select! 取消。
-
假设只有一条线程调用 wait()。如果检测到多个并发 wait(),将因无效使用而引发 panic。
-
允许并发调用 done() 和 wait()。
-
允许并发调用 add() 和 done()。
-
add() 和 wait() 不会冲突,但并发调用不是好的模式。
示例
extern crate atomic_waitgroup;
use atomic_waitgroup::WaitGroup;
use tokio::runtime::Runtime;
let rt = Runtime::new().unwrap();
let wg = WaitGroup::new();
rt.block_on(async move {
for i in 0..2 {
let _guard = wg.add_guard();
tokio::spawn(async move {
// Do something
drop(_guard);
});
}
match tokio::time::timeout(
tokio::time::Duration::from_secs(1),
wg.wait_to(1)).await {
Ok(_) => {
assert!(wg.left() <= 1);
}
Err(_) => {
println!("wg.wait_to(1) timeouted");
}
}
});
依赖
~0.4–5.5MB
~13K SLoC