Expand description
§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;
// schedule!
let mut result = Vec::new();
for _ in 0..30 {
result.push(queue.select().await.unwrap().data().clone());
}
// expected to be this sequence:
assert_eq!(result, Vec::from_iter( [ "d", "c", "b", "d", "e", "d", "c", "a", "d", "b", "e", "c", "d"].into_iter().cycle().take(30)));
}§features
default:tokiotokio: async interface, usingtokio::sync::RwLockto guarantee best performanceblocking: not compatible withtokio, usingstd::sync::RwLockfor blocking acquire