地址: https://github.com/al8n/wg
支持同步, 异步(不依赖特定运行时), no_std环境的的使用方法像Golang一样的WaitGroup.
例子
Sync
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);
}
Async
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);
}
Ext Link: https://github.com/al8n/wg
1
共 9 条评论, 1 页
评论区
写评论(当然如果是优化 wait 的开销,感觉还是需要先来一段 spin)
想了一下确实,既然 runtime 已经有任务调度系统,spin 就不需要了。
异步的waitgroup即使是no_std环境也没有用到spin, 同步的wait group, wait的时候是一个spin loop.
--
👇
TinusgragLin: 这样的话等待是不是就是得一直 spin 了?
--
👇
星夜的蓝天: 特点应该是支持libcore的no_std吧
如果你有动态添加的long running thread, scope用不了, 要不就收集所有JoinHandle 然后一个一个等, 但收集joinhandle又要用到collection, 如果你要实现内部可变性, 又要加锁或者用lock-free结构, 然后收集joinhandle的问题又来了一个什么时候移除已经退出的join handle.
--
👇
bestgopher: 同步为什么不用scope呢?
tokio那个只能tokio用,强绑定runtime
--
👇
Bai-Jinlin: tokio官方有个类似的东西 https://docs.rs/tokio-util/latest/tokio_util/task/task_tracker/struct.TaskTracker.html#spawn-tasks-and-wait-for-them-to-exit
这样的话等待是不是就是得一直 spin 了?
--
👇
星夜的蓝天: 特点应该是支持libcore的no_std吧
特点应该是支持libcore的no_std吧
同步为什么不用scope呢?
tokio官方有个类似的东西 https://docs.rs/tokio-util/latest/tokio_util/task/task_tracker/struct.TaskTracker.html#spawn-tasks-and-wait-for-them-to-exit