3 releases
0.1.2 | Feb 1, 2024 |
---|---|
0.1.1 | Dec 18, 2023 |
0.1.0 | Dec 18, 2023 |
#553 in Algorithms
28 downloads per month
15KB
267 lines
Async WRR Queue
this is a wrapping of weighted round-robin
schedule algorithm, utilizing atomic operation
and cache queue in order to avoid lock latency or the schedule latency. And we have
used an async RwLock
(feature default
or tokio
) to overcome the conflict of select instance and
recalculate queue.
- async interface for tokio
- Atomic operation aimed to provide the best run-time performance
- dynamic insert supported
more detailed documented WrrQueue | Instance
Example
use async_wrr_queue::*;
#[tokio::main]
async fn main() {
let mut queue = WrrQueue::new();
// insert many
queue.insert_many(vec![("a", 1usize), ("b", 2usize)]).await;
// insert one
queue.insert(("c", 3usize)).await;
queue.insert_many(vec![("d", 5usize), ("e", 2usize)]).await;
let mut expected = [
"d", "c", "b", "d", "e", "d", "c", "a", "d", "b", "e", "c", "d",
]
.iter()
.cycle();
for _ in 0..30 {
// schedule!
let select = queue.select().await;
assert_eq!(expected.next().unwrap(), select.unwrap().data(),);
}
}
features
default
:tokio
tokio
: async interface, usingtokio::sync::RwLock
to guarantee best performanceblocking
: not compatible withtokio
, usingstd::sync::RwLock
for blocking acquire
Dependencies
~2.8–4.5MB
~76K SLoC