#queue #unbounded #spsc #consumer #performance #cache #buffer

nightly unbounded-spsc

bounded_spsc_queue 构建的无界SPSC队列

8个版本

0.1.9 2023年5月6日
0.1.8 2023年1月6日
0.1.7 2022年3月21日
0.1.6 2020年8月27日
0.1.3 2018年4月30日

#153 in 缓存

Download history 8/week @ 2024-03-12 1/week @ 2024-03-19 3/week @ 2024-03-26 30/week @ 2024-04-02 81/week @ 2024-04-16 1/week @ 2024-04-30

138 每月下载次数
apis 中使用

Apache-2.0

46KB
1.5K SLoC

unbounded_spsc

bounded_spsc_queue 的 "无界" 扩展。

该软件包提供了一个无界SPSC队列,具有异步发送功能,使用 bounded_spsc_queue 作为内部队列。这比标准库中使用的链表队列提供了更好的性能和缓存一致性。

除了有界,bounded_spsc_queue 本身只提供自旋等待以阻塞 recv(缓冲区为空时阻塞),因此这里对标准库中找到的阻塞等待代码进行了适配,以提供更友好的CPU阻塞机制,包括带超时和不带超时。

请注意,bounded_spsc_queue 不支持零大小消息类型(如单元类型 ()),并且会因未指定的错误而崩溃;这里我们检查零大小并使用 panic! 和错误消息进行恐慌。

发送始终是异步的;如果底层缓冲区已满,则创建一个大小为前一个缓冲区两倍的新缓冲区,并通过标准的异步 mpsc 通道将其发送给消费者。目前没有机制可以指定初始容量(硬编码为128)或缩小。

这里不提供同步发送(缓冲区满时阻塞):为此,请使用 bounded_spsc_queue 直接(自旋等待)或标准 std::sync::mpsc::sync_channel(阻塞等待;内部使用基于向量的缓冲区)。

还从标准库中提取了(不稳定)的宏及其相关功能实现,该功能允许在多个接收器上等待。正如原始实现中所述,这段代码由于涉及一些分配,不是最优的,并且没有实现任何“公平性”协议——请参阅https://github.com/rust-lang/rust/issues/27800

依赖项

~255KB