#async #singleflight #tokio

async_singleflight

异步 singleflight

12 个版本

0.5.2 2022 年 11 月 30 日
0.5.1 2022 年 11 月 30 日
0.5.0 2022 年 6 月 30 日
0.4.0 2021 年 10 月 20 日
0.0.6 2021 年 2 月 16 日

异步 中排名 #671

Download history 42/week @ 2024-03-11 15/week @ 2024-03-18 16/week @ 2024-03-25 45/week @ 2024-04-01 10/week @ 2024-04-08 9/week @ 2024-04-15 33/week @ 2024-04-22 6/week @ 2024-04-29 10/week @ 2024-05-13 18/week @ 2024-05-20 8/week @ 2024-05-27 17/week @ 2024-06-03 19/week @ 2024-06-10 26/week @ 2024-06-17 10/week @ 2024-06-24

每月下载量 72
用于 2 crates

MIT/Apache 许可

14KB
319 行代码(不包括注释)

异步 singleflight

文档:async_singleflight.


lib.rs:

tokio 的 singleflight 实现。

灵感来自 singleflight.

示例

use futures::future::join_all;
use std::sync::Arc;
use std::time::Duration;

use async_singleflight::Group;

const RES: usize = 7;

async fn expensive_fn() -> Result<usize, ()> {
    tokio::time::sleep(Duration::new(1, 500)).await;
    Ok(RES)
}

#[tokio::main]
async fn main() {
    let g = Arc::new(Group::<_, ()>::new());
    let mut handlers = Vec::new();
    for _ in 0..10 {
        let g = g.clone();
        handlers.push(tokio::spawn(async move {
            let res = g.work("key", expensive_fn()).await.0;
            let r = res.unwrap();
            println!("{}", r);
        }));
    }

    join_all(handlers).await;
}

依赖项

~5–12MB
~112K SLoC