1 个不稳定版本
0.1.0 | 2024 年 4 月 6 日 |
---|
#991 在 并发
39KB
736 行
Burstq
支持在单次操作中发送或接收多个项目的多个生产者、多个消费者通道。
目前,仅支持异步和忙等待模式。如果您想阻塞当前线程,则需要使用类似 pollster 的最小异步执行器。
如果您想发送和接收相对较大的批次(例如,每个批次超过 10 个项目),但允许动态和不均匀的批次大小,这可能就是您需要的 crate。
如果您一次发送或接收一个项目,或者更普遍地说,发送者和接收者具有相同的精确批次大小,您可能更倾向于使用许多其他通道 crate 之一。
let (tx, rx) = mpmc::<u32>(5);
let thread = std::thread::spawn(move || {
pollster::block_on(async move {
let mut next = 0;
let payload: Vec<_> = (0..10).collect();
while next < 10 {
let n = tx.send(10 - next, |w| {
let len = w.len();
w.write_slice(&payload[next..next + len]);
})
.await
.unwrap();
next += n;
}
});
});
let received = pollster::block_on(async move {
let mut received = Vec::new();
while received.len() < 10 {
rx.recv(10 - received.len(), |r| {
received.extend(r);
})
.await
.unwrap();
}
received
});
thread.join().unwrap();
assert_eq!((0..10).sum::<u32>(), received.iter().sum());
Burstq 的核心无锁入队/出队算法基于 DPDK 的 rte_ring
。特别是,它实现了 rte_ring
的“爆发”(而非“批量”)行为,即如果无法入队/出队所有请求的项目,则尽可能多地入队/出队。
Burstq 的异步性是通过使用 async-event crate 实现的。
许可证
MIT
依赖关系
~0.2–24MB
~335K SLoC