5个版本 (3个重大变更)
0.9.1 | 2024年4月27日 |
---|---|
0.8.3 | 2024年4月20日 |
0.8.1 |
|
0.4.2 |
|
0.2.0 |
|
#94 在 异步 中
每月下载量7,817次
用于 26 个crate (7个直接使用)
34KB
362 行
wg
简介
默认情况下,阻塞版本的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);
}
致谢
- 灵感来源于Golang的sync.WaitGroup和
crossbeam_utils::WaitGroup
。
许可证
根据您的选择,许可协议为Apache License, Version 2.0或MIT license。 除非您明确声明,否则您有意提交给本项目并由您创建的贡献,根据Apache-2.0许可证的定义,应按上述方式双重许可,而不附加任何其他条款或条件。依赖关系
~0.5–6MB
~20K SLoC