use batched_fn::batched_fn;
use tokio::time::{self, Duration};
type Batch<T> = Vec<T>;
type Input = i32;
type Output = i32;
struct Model {}
impl Model {
fn predict(&self, batch: Batch<Input>) -> Batch<Output> {
batch.iter().map(|input| input * 2).collect()
}
fn load() -> Self {
Self {}
}
}
async fn predict_for_single_input(input: Input) -> Output {
let batch_predict = batched_fn! {
handler = |batch: Batch<Input>, model: &Model| -> Batch<Output> {
let output = model.predict(batch.clone());
println!("Processed batch {:?} -> {:?}", batch, output);
output
};
config = {
max_batch_size: 4,
max_delay: 50,
};
context = {
model: Model::load(),
};
};
batch_predict(input).await.unwrap()
}
#[tokio::main]
async fn main() {
let mut handles = vec![tokio::spawn(async move {
let o = predict_for_single_input(0).await;
println!("0 -> {}", o);
})];
time::sleep(Duration::from_millis(10)).await;
for i in 1..10 {
handles.push(tokio::spawn(async move {
let o = predict_for_single_input(i).await;
println!("{} -> {}", i, o);
}));
}
for join_handle in handles {
join_handle.await.unwrap();
}
}