7个版本 (稳定)
新 1.1.0 | 2024年8月20日 |
---|---|
1.0.3 | 2024年8月19日 |
1.0.2 | 2024年8月17日 |
0.1.1 | 2024年8月16日 |
0.1.0 | 2024年8月16日 |
365 在 算法 中
每月533 次下载
23KB
341 行
async-rate-limiter
async-rate-limiter实现了一种token bucket算法,可用于限制API访问频率。
特性
- 简单易用
- 支持并发访问
- 低开销,token数量随时间计算
得益于Rust的async
/ await
,此crate非常简单易用。只需将函数调用放在RateLimiter::acquire()
.await
之后,函数将以指定的速率限制被调用。
RateLimiter
还实现了Clone
特质,因此您可以轻松地在多个任务环境中使用它。
示例
更新您的Cargo.toml
[dependencies]
# Change features to ["rt-async-std"] if you are using async-std runtime.
async-rate-limiter = { version = "1", features = ["rt-tokio"] }
这是一个简单的示例
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支持不同的异步运行时,目前支持tokio & async-std。您可以使用功能切换异步运行时。
依赖关系
~0.6–11MB
~124K SLoC