Crates.io | arl |
lib.rs | arl |
version | 0.2.0 |
source | src |
created_at | 2022-11-07 20:52:56.232917 |
updated_at | 2023-10-08 09:28:48.68837 |
description | A rate limiter to be used with tokio |
homepage | |
repository | https://github.com/lukaszwojtow/arl |
max_upload_size | |
id | 707462 |
size | 24,829 |
Arl's main purpose is to simplify dealing with various APIs' limits. For example, GitHub allows 5000 requests per hour. Keeping a timer inside your business logic can obscure the main flow and will add lots of boilerplate.
With Arl it's possible to limit a task's speed with single line of code. As an added benefit, the limiter can be cloned and send to other threads/tasks and all of them will see the same instance and adhere to the same limits.
Example:
// Create a rate limiter. Limit speed to 10 times in 2 seconds.
let limiter = RateLimiter::new(10, Duration::from_secs(2));
// Spawn 4 threads.
for i in 0..4 {
// RateLimiter can be cloned - all threads will use the same timer/stats underneath.
let limiter = limiter.clone();
tokio::spawn(async move {
// Create some imaginary client (for a rest service or sth).
let client = Client::new();
// Do things in a loop. Notice there is no `sleep` in here.
loop {
// Wait if needed. First 10 will be executed immediately.
limiter.wait().await;
// Call some api here.
let response = client.call();
}
});
}