use std::sync::Arc;
use anyhow::Result;
use tokio::time::Duration;
#[tokio::main]
async fn main() -> Result<()> {
helpers::init_logging();
for iteration in 0..5 {
let limiter = Arc::new(
leaky_bucket::RateLimiter::builder()
.initial(100)
.refill(100)
.interval(Duration::from_millis(200))
.max(100)
.build(),
);
let mut tasks = Vec::new();
let mut expected = Vec::new();
for n in 0..10 {
let limiter = limiter.clone();
let task = tokio::spawn(async move {
let mut locals = Vec::new();
for i in 0..10 {
limiter.acquire(10).await;
println!("tick: {}:{}:{}", iteration, n, i);
locals.push((n, i));
}
locals
});
for i in 0..10 {
expected.push((n, i));
}
tasks.push(task);
}
let mut globals = Vec::new();
for t in tasks {
globals.extend(t.await?);
}
globals.sort();
assert_eq!(expected, globals);
}
Ok(())
}