#缓存 #批处理 #Facebook #async-await #加载 #批处理器 #请求

dataloader

Rust实现Facebook的DataLoader,使用async-await

23个版本 (破坏性更新)

0.17.0 2023年10月25日
0.16.0 2022年9月6日
0.15.0 2022年3月22日
0.14.0 2021年1月12日
0.5.0 2017年2月3日

#273 in 异步

Download history 1680/week @ 2024-04-23 1545/week @ 2024-04-30 1523/week @ 2024-05-07 1188/week @ 2024-05-14 1606/week @ 2024-05-21 1460/week @ 2024-05-28 1520/week @ 2024-06-04 1349/week @ 2024-06-11 1322/week @ 2024-06-18 1058/week @ 2024-06-25 1507/week @ 2024-07-02 1368/week @ 2024-07-09 1388/week @ 2024-07-16 1659/week @ 2024-07-23 1601/week @ 2024-07-30 1443/week @ 2024-08-06

每月下载量6,300次

MIT/Apache

24KB
507 代码行数(不含注释)

Dataloader

Rust Crates.io

使用async-await实现的Facebook DataLoader的Rust版本。

文档

功能

  • 带缓存的批处理加载请求
  • 不带缓存的批处理加载请求

用法

通过使用Cargo功能切换运行时

  • runtime-async-std(默认),使用async-std运行时
    • dataloader = "0.17"
  • runtime-tokio 使用Tokio运行时
    • dataloader = { version = "0.17", default-features = false, features = ["runtime-tokio"]}

添加到你的 Cargo.toml

[dependencies]
dataloader = "0.17"
futures = "0.3"

示例

use dataloader::cached::Loader;
use dataloader::BatchFn;
use futures::executor::block_on;
use futures::future::ready;
use std::collections::HashMap;
use std::thread;

struct MyLoadFn;

impl BatchFn<usize, usize> for MyLoadFn {
    async fn load(&mut self, keys: &[usize]) -> HashMap<usize, usize> {
        println!("BatchFn load keys {:?}", keys);
        let ret = keys.iter()
            .map(|v| (v.clone(), v.clone()))
            .collect::<HashMap<_, _>>();
        ready(ret).await
    }
}

fn main() {
    let mut i = 0;
    while i < 2 {
        let a = MyLoadFn;
        let loader = Loader::new(a).with_max_batch_size(4);

        let l1 = loader.clone();
        let h1 = thread::spawn(move || {
            let r1 = l1.load(1);
            let r2 = l1.load(2);
            let r3 = l1.load(3);

            let r4 = l1.load_many(vec![2, 3, 4, 5, 6, 7, 8]);
            let f = futures::future::join4(r1, r2, r3, r4);
            println!("{:?}", block_on(f));
        });

        let l2 = loader.clone();
        let h2 = thread::spawn(move || {
            let r1 = l2.load(1);
            let r2 = l2.load(2);
            let r3 = l2.load(3);
            let r4 = l2.load(4);
            let f = futures::future::join4(r1, r2, r3, r4);
            println!("{:?}", block_on(f));
        });

        h1.join().unwrap();
        h2.join().unwrap();
        i += 1;
    }
}

许可

此项目根据您的选择许可为以下之一

依赖

~0–10MB
~101K SLoC