4个版本
新 0.1.3 | 2024年8月21日 |
---|---|
0.1.2 | 2024年2月1日 |
0.1.1 | 2023年12月18日 |
0.1.0 | 2023年12月18日 |
571 在 算法 中
每月 108 次下载
15KB
267 行
Async WRR Queue
这是一个加权轮询调度算法的封装,利用原子操作和缓存队列以避免锁定延迟或调度延迟。我们使用了异步RwLock(功能default
或tokio
)来克服选择实例和重新计算队列的冲突。
- tokio的异步接口
- 针对最佳运行时性能的原子操作
- 支持动态插入
示例
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)));
}
功能
default
:tokio
tokio
: 异步接口,使用tokio::sync::RwLock
以保证最佳性能blocking
: 与tokio
不兼容,使用std::sync::RwLock
进行阻塞获取
依赖项
~2.7–4.5MB
~75K SLoC