< 返回版块

al8n 发表于 2024-04-27 21:09

Tags:waitgroup

地址: 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

评论区

写评论
TinusgragLin 2024-04-29 17:34

(当然如果是优化 wait 的开销,感觉还是需要先来一段 spin)

TinusgragLin 2024-04-29 17:22

异步的waitgroup即使是no_std环境也没有用到spin

想了一下确实,既然 runtime 已经有任务调度系统,spin 就不需要了。

作者 al8n 2024-04-29 17:18

异步的waitgroup即使是no_std环境也没有用到spin, 同步的wait group, wait的时候是一个spin loop.

--
👇
TinusgragLin: 这样的话等待是不是就是得一直 spin 了?

--
👇
星夜的蓝天: 特点应该是支持libcore的no_std吧

作者 al8n 2024-04-29 17:15

如果你有动态添加的long running thread, scope用不了, 要不就收集所有JoinHandle 然后一个一个等, 但收集joinhandle又要用到collection, 如果你要实现内部可变性, 又要加锁或者用lock-free结构, 然后收集joinhandle的问题又来了一个什么时候移除已经退出的join handle.

--
👇
bestgopher: 同步为什么不用scope呢?

作者 al8n 2024-04-29 17:11

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

TinusgragLin 2024-04-28 10:58

这样的话等待是不是就是得一直 spin 了?

--
👇
星夜的蓝天: 特点应该是支持libcore的no_std吧

星夜的蓝天 2024-04-28 10:51

特点应该是支持libcore的no_std吧

bestgopher 2024-04-28 09:52

同步为什么不用scope呢?

Bai-Jinlin 2024-04-28 08:39

tokio官方有个类似的东西 https://docs.rs/tokio-util/latest/tokio_util/task/task_tracker/struct.TaskTracker.html#spawn-tasks-and-wait-for-them-to-exit

1 共 9 条评论, 1 页