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 异步
每月下载量6,300次
24KB
507 代码行数(不含注释)
Dataloader
使用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;
}
}
许可
此项目根据您的选择许可为以下之一
- Apache License, Version 2.0, (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 http://opensource.org/licenses/MIT)
。
依赖
~0–10MB
~101K SLoC