10 个版本
0.3.1 | 2024年5月26日 |
---|---|
0.3.0 | 2023年11月12日 |
0.2.3 | 2022年12月13日 |
0.2.2 | 2022年3月4日 |
0.1.1 | 2020年11月20日 |
#33 在 并发 类别中排名
42,904 每月下载量
在 50 个 Crates 中使用(直接使用 13 个)
78KB
697 代码行
实时环形缓冲区
Rust 的无等待单生产者单消费者(SPSC)环形缓冲区。
此包可以在不使用标准库的情况下使用(通过禁用默认启用的 std
功能),但仍然需要 alloc 包。
用法
将以下内容添加到您的 Cargo.toml
[dependencies]
rtrb = "0.3"
重大变更
有关重大变更的列表以及如何升级到已发布版本的操作说明,请参阅 变更日志。
性能
衡量线程间通信数据结构的性能可能相当脆弱,结果取决于许多因素。一些竞争包之间的性能比较可以在 问题 #39 中看到,但像所有基准测试一样,它们存在严重缺陷,应谨慎对待。您应该根据您的使用模式进行自己的测量。您可以通过在该问题下发表评论来分享您自己的结果。
开发
创建 HTML 文档(将可在 target/doc/rtrb/index.html
中找到)
cargo doc
运行测试
cargo test
测试基准(不实际进行基准测试)
cargo test --benches
运行基准测试(使用 criterion 包;结果将在 target/criterion/report/index.html
中提供)
cargo bench
为基准测试创建 火焰图;首先是一些准备工作
cargo install flamegraph
echo -1 | sudo tee /proc/sys/kernel/perf_event_paranoid
export CARGO_PROFILE_BENCH_DEBUG=true
然后,创建火焰图(将保存到flamegraph.svg
),提供基准(例如two_threads
),期望的运行时间和可选的基准函数(例如large
)
cargo flamegraph --bench two_threads -- --bench --profile-time 10 large
要测量代码覆盖率,需要夜间的Rust版本,以及一些额外的依赖项
rustup toolchain install nightly
rustup component add llvm-tools-preview
cargo install grcov
可以使用以下命令获取和测试覆盖率数据
cargo clean
RUSTFLAGS="-Z instrument-coverage" RUSTDOCFLAGS="-Z instrument-coverage -Z unstable-options --persist-doctests target/debug/doctestbins" LLVM_PROFILE_FILE="coverage/%p-%m.profraw" cargo +nightly test
grcov coverage --source-dir . --binary-path target/debug --output-type html --output-path coverage
最后一个命令将在coverage/index.html
中创建一个HTML报告。
使用Miri进行测试也需要夜间的Rust
cargo +nightly miri test
还应该尝试这个Miri标志
MIRIFLAGS="-Zmiri-preemption-rate=0" cargo +nightly miri test
使用ThreadSanitizer运行测试也需要夜间的Rust
RUSTFLAGS="-Z sanitizer=thread" cargo +nightly test --tests -Z build-std --target x86_64-unknown-linux-gnu
可能需要将--target
选项适配到您的系统(例如,参见rustup show
)。
最低支持的rustc
版本
此crate的最低支持rustc
版本(MSRV)为1.38.0
。MSRV预计不会频繁更新,但如果更新,至少会有一个次要版本号的提升。
起源故事
初始代码是从https://github.com/crossbeam-rs/crossbeam/pull/338中获取的,已获得PR作者的许可。
使用git-filter-repo将其从其余的crossbeam
中分离出来
git-filter-repo --subdirectory-filter crossbeam-queue --path src/spsc.rs --path tests/spsc.rs --refs refs/heads/spsc
替代方案
如果您不喜欢这个crate,没有问题,您可以选择几个替代方案。有许多类型的环形缓冲区可用,这里我们仅限于无等待SPSC实现
- ach-spsc(使用const generics)
- heapless(适用于嵌入式系统,请参阅
heapless::spsc
) - jack(JACK的FFI绑定,请参阅
jack::Ringbuffer
) - magnetic(请参阅
magnetic::spsc
模块) - npnc(请参阅
npnc::bounded::spsc
模块) - ringbuf(支持const generics和堆分配)
- ringbuffer-spsc(使用const generics)
- shmem-ipc(请参阅
shmem_ipc::sharedring
和shmem_ipc::ringbuf
模块)
还有其他语言的实现
- boost::lockfree::spsc_queue(C++)
- folly::ProducerConsumerQueue(C++)
- JACK ring buffer(C)
- PortAudio ring buffer(C)
- readerwriterqueue(C++)
- ringbuf.js(JavaScript,使用
SharedArrayBuffer
) - SPSCQueue(C++)
如果您知道此列表中的更多替代方案,请打开一个问题。
许可证
根据以下之一获得许可
- Apache许可证,版本2.0(《LICENSE-APACHE》或https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(《LICENSE-MIT》或http://opensource.org/licenses/MIT)
由你选择。
请注意,本包包含来自https://github.com/crossbeam-rs/crossbeam的文件cache_padded.rs
的副本。
贡献
除非你明确说明,否则任何有意提交以包含在你所定义的工作中的贡献,根据Apache-2.0许可证,将如上双重许可,不附加任何额外条款或条件。