7 个版本 (4 个破坏性更新)
0.5.1 | 2021年5月24日 |
---|---|
0.5.0 | 2021年2月1日 |
0.4.0 | 2021年1月9日 |
0.3.1 | 2020年10月15日 |
0.1.0 | 2019年6月18日 |
#746 在 并发 中
每月下载量:87
54KB
1K SLoC
ipmpsc
Rust 的进程间多生产者、单消费者通道
摘要
此库提供了一种基于共享内存环形缓冲区的类型安全、高性能的进程间通道实现。它使用 bincode 进行(反)序列化,包括零拷贝反序列化,非常适合包含大 &str
或 &[u8]
字段的消息。并且它的名字读起来很顺口。
示例
示例目录包含一个发送者和接收者对,您可以在不同的终端中运行它们,如下所示
cargo run --example ipmpsc-receive -- --zero-copy /tmp/ipmpsc
cargo run --example ipmpsc-send -- /tmp/ipmpsc
在发送者中输入一些文本行,并观察它们是否被接收者打印出来。您还可以从其他终端运行额外的发送者 - 接收者将接收来自任何发送者的消息。
性能
ipmpsc::Receiver::zero_copy_context
,与 serde_bytes 结合使用,能够支持非常高的带宽、低延迟传输(例如,未压缩的视频帧)。
请参阅 ipc-benchmarks 子 crate,其中包含一些简单的基准测试,比较了 ipmpsc
与 ipc_channel
的高级和低级接口。以下是我在 Ubuntu 笔记本上的结果
test tests::bench_ipc_channel ... bench: 16,013,621 ns/iter (+/- 932,033)
test tests::bench_ipc_channel_bytes ... bench: 4,777,240 ns/iter (+/- 242,369)
test tests::bench_ipmpsc ... bench: 1,380,406 ns/iter (+/- 62,038)
安全和安全性
环形缓冲区由共享内存映射文件支持,这意味着任何有权访问该文件的进程都可以根据其权限从中读取或写入。这取决于您的应用程序的安全需求以及它运行的环境是否可以接受。
请注意,零拷贝反序列化可以提供对映射文件的共享引用,并且 ipmpsc 在从环形缓冲区读取和写入时,内部使用共享和唯一引用文件的部分。只有在所有访问文件的进程都遵守 Rust 的内存安全规则(这通常只在单个进程中有意义)时,这些引用才是安全的。ipmpsc 本身应遵守规则(如果不遵守,请报告错误),但如果任何进程未能这样做,则无法保证安全性。
平台支持
该库目前适用于Linux、Android和Windows操作系统。不幸的是,它在MacOS上无法稳定运行。有关详情,请参阅https://github.com/dicej/ipmpsc/issues/4。欢迎提交PR来修复这个问题!
类似项目
ipc-channel - 成熟且健壮的IPC通道。目前尚不支持Android、Windows、多并发发送者或零拷贝反序列化。
shared_memory - 低级别、跨平台的共享内存支持。可能用作基于环形缓冲区的通道的基础,但尚不支持Android。
依赖关系
~2–12MB
~144K SLoC