#channel #mpmc #fifo #mpsc #sender #multiple-values

无 std burstq

支持在单次操作中发送或接收多个值的多个生产者、多个消费者通道

1 个不稳定版本

0.1.0 2024 年 4 月 6 日

#991并发

MIT 许可证

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