#wait-group #async

atomic-waitgroup

支持异步的高级功能的 waitgroup 实现

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

BSD-1-Clause

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