#async-task #async #singleflight #run-time #safe #style #key

singleflight-async

异步风格的Singleflight

4个版本

0.1.3 2024年7月3日
0.1.2 2024年7月3日
0.1.1 2022年3月11日
0.1.0 2022年3月11日

#374异步

每月46次下载
用于 groupcache

MIT/Apache

15KB
302

Singleflight Async

Crates.io MIT/Apache-2 licensed

Singleflight 以异步风格实现。

主要功能

  • 同一时间只对相同的key执行一次异步任务。
  • 任务被丢弃时安全取消。
  • 不需要future是 Send/Sync,或 'static
  • 适用于所有类型的运行时,包括tokio、monoio或其他。

示例

use singleflight_async::SingleFlight;

#[tokio::main]
async fn main() {
    let group = SingleFlight::new();
    let mut futures = Vec::new();
    for _ in 0..10 {
        futures.push(group.work("key", || async {
            println!("will sleep to simulate async task");
            tokio::time::sleep(std::time::Duration::from_millis(100)).await;
            println!("real task done");
            "my-result"
        }));
    }

    let begin = std::time::Instant::now();
    for fut in futures.into_iter() {
        assert_eq!(fut.await, "my-result");
        println!("task finished");
    }
    println!("time elapsed: {:?}", begin.elapsed());
}

输出将如下

will sleep to simulate async task
real task done
task finished
task finished
task finished
task finished
task finished
task finished
task finished
task finished
task finished
task finished
time elapsed: 100.901321ms

依赖项

~2.4–8MB
~57K SLoC