#wait-group #sync #async #wake #notify

no-std wg

Golang风格的WaitGroup实现,适用于同步/异步Rust

5个版本 (3个重大变更)

0.9.1 2024年4月27日
0.8.3 2024年4月20日
0.8.1 2024年3月13日
0.4.2 2023年9月30日
0.2.0 2021年11月30日

#94异步

Download history 1797/week @ 2024-04-28 2220/week @ 2024-05-05 2357/week @ 2024-05-12 2468/week @ 2024-05-19 1697/week @ 2024-05-26 2150/week @ 2024-06-02 2482/week @ 2024-06-09 2059/week @ 2024-06-16 1712/week @ 2024-06-23 1773/week @ 2024-06-30 1820/week @ 2024-07-07 1459/week @ 2024-07-14 1984/week @ 2024-07-21 2325/week @ 2024-07-28 1857/week @ 2024-08-04 1471/week @ 2024-08-11

每月下载量7,817次
用于 26 个crate (7个直接使用)

MIT/Apache

34KB
362

wg

类似于Golang的WaitGroup实现,适用于同步/异步Rust,支持no_std环境。

github Build codecov

docs.rs crates.io crates.io

license

简介

默认情况下,阻塞版本的WaitGroup已启用。

如果您使用其他异步运行时,您需要在您的Cargo.toml中启用wg::AsyncWaitGroup功能,并使用。

安装

  • std

    [dependencies]
    wg = "0.9"
    
  • future

    [dependencies]
    wg = { version = "0.9", features = ["future"] }
    
  • no_std

    [dependencies]
    wg = { version = "0.9", default_features = false, features = ["alloc"] }
    
  • no_std & future

    [dependencies]
    wg = { version = "0.9", default_features = false, features = ["alloc", "future"] }
    

示例

同步

use wg::WaitGroup;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use std::time::Duration;
use std::thread::{spawn, sleep};

fn main() {
    let wg = WaitGroup::new();
    let ctr = Arc::new(AtomicUsize::new(0));

    for _ in 0..5 {
        let ctrx = ctr.clone();
        let t_wg = wg.add(1);
        spawn(move || {
            // mock some time consuming task
            sleep(Duration::from_millis(50));
            ctrx.fetch_add(1, Ordering::Relaxed);

            // mock task is finished
            t_wg.done();
        });
    }

    wg.wait();
    assert_eq!(ctr.load(Ordering::Relaxed), 5);
}

异步

use wg::AsyncWaitGroup;
use std::sync::Arc;
use std::sync::atomic::{AtomicUsize, Ordering};
use tokio::{spawn, time::{sleep, Duration}};

#[tokio::main]
async fn main() {
    let wg = AsyncWaitGroup::new();
    let ctr = Arc::new(AtomicUsize::new(0));

    for _ in 0..5 {
        let ctrx = ctr.clone();
        let t_wg = wg.add(1);
        spawn(async move {
            // mock some time consuming task
            sleep(Duration::from_millis(50)).await;
            ctrx.fetch_add(1, Ordering::Relaxed);

            // mock task is finished
            t_wg.done();
        });
    }

    wg.wait().await;
    assert_eq!(ctr.load(Ordering::Relaxed), 5);
}

致谢

许可证

根据您的选择,许可协议为Apache License, Version 2.0MIT license 除非您明确声明,否则您有意提交给本项目并由您创建的贡献,根据Apache-2.0许可证的定义,应按上述方式双重许可,而不附加任何其他条款或条件。

依赖关系

~0.5–6MB
~20K SLoC