Crates.io | async-rate-limiter |
lib.rs | async-rate-limiter |
version | 1.1.0 |
source | src |
created_at | 2024-08-16 17:56:33.479101 |
updated_at | 2024-08-20 01:24:03.895556 |
description | Implements a token bucket algorithm that can be used to limit API access frequency. Written in pure Rust. |
homepage | https://github.com/mindeng/async-rate-limiter |
repository | https://github.com/mindeng/async-rate-limiter |
max_upload_size | |
id | 1340531 |
size | 24,298 |
async-rate-limiter implements a token bucket algorithm that can be used to limit API access frequency.
Thanks to Rust’s async
/ await
, this crate is very simple to use. Just put
your function call after
RateLimiter::acquire()
.await
,
then the function will be called with the specified rate limit.
[RateLimiter
] also implements Clone
trait, so you can use it in
multiple tasks environment easily.
Update your Cargo.toml
:
[dependencies]
# Change features to ["rt-async-std"] if you are using async-std runtime.
async-rate-limiter = { version = "1", features = ["rt-tokio"] }
Here is a simple example:
use async_rate_limiter::RateLimiter;
use std::time::Duration;
use tokio::spawn;
#[tokio::main]
async fn main() {
let rl = RateLimiter::new(3);
// You can change `burst` at anytime
rl.burst(5);
rl.acquire().await;
println!("Do something that you want to limit the rate ...");
let res = rl.try_acquire();
if res.is_ok() {
println!("Do something that you want to limit the rate ...");
}
// acquire with a timeout
let ok = rl.acquire_with_timeout(Duration::from_secs(10)).await;
if ok {
println!("Do something that you want to limit the rate ...");
}
// Concurrent use
let rl = rl.clone();
spawn(async move {
let res = rl.acquire_with_timeout(Duration::from_millis(340)).await;
assert!(res);
});
}
async-rate-limiter can support different async runtimes, tokio & async-std are supported currently. You can use features to switch async runtimes.