#cache #batching #facebook #async-await #batcher #load #loader

dataloader

Rust implementation of Facebook's DataLoader using async-await

24 releases (breaking)

0.18.0 Oct 29, 2024
0.17.0 Oct 25, 2023
0.16.0 Sep 6, 2022
0.15.0 Mar 22, 2022
0.5.0 Feb 3, 2017

#111 in Asynchronous

Download history 1662/week @ 2024-08-17 1503/week @ 2024-08-24 1290/week @ 2024-08-31 1914/week @ 2024-09-07 1297/week @ 2024-09-14 1564/week @ 2024-09-21 2303/week @ 2024-09-28 1547/week @ 2024-10-05 1805/week @ 2024-10-12 1641/week @ 2024-10-19 1802/week @ 2024-10-26 1697/week @ 2024-11-02 2023/week @ 2024-11-09 1475/week @ 2024-11-16 1424/week @ 2024-11-23 1646/week @ 2024-11-30

6,876 downloads per month

MIT/Apache

24KB
515 lines

Dataloader

Rust Crates.io

Rust implementation of Facebook's DataLoader using async-await.

Documentation

Features

  • Batching load requests with caching
  • Batching load requests without caching

Usage

Switching runtime, by using cargo features

  • runtime-async-std (default), to use the async-std runtime
    • dataloader = "0.18"
  • runtime-tokio to use the Tokio runtime
    • dataloader = { version = "0.18", default-features = false, features = ["runtime-tokio"]}

Add to your Cargo.toml:

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

Example:

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;
    }
}

LICENSE

This project is licensed under either of

at your option.

Dependencies

~0–10MB
~109K SLoC