7 个不稳定版本 (3 个破坏性更新)
0.3.0 | 2024年4月18日 |
---|---|
0.2.2 | 2024年1月17日 |
0.1.1 | 2023年12月15日 |
0.0.5 | 2023年12月14日 |
#321 在 网络编程
每月101次下载
1.5MB
29K SLoC
iceoryx2 - 使用 Rust 实现的纯零拷贝无锁 IPC
简介
欢迎来到 Iceoryx2,这是一个高效且超低延迟的进程间通信中间件。该库旨在为您提供快速可靠的零拷贝和无锁进程间通信机制。
Iceoryx2 专注于提供无缝的进程间通信体验,具有多种消息模式。无论是深入到发布/订阅、事件,还是期待未来功能,如请求/响应、管道和黑板,Iceoryx2 都能满足您的需求。
Iceoryx2 的一个特点是无论负载大小如何,都能保持低传输延迟,确保可预测和可靠的通信体验。
Iceoryx2 的起源可以追溯到 iceoryx。通过解决过去的技术债务和优化架构,Iceoryx2 实现了我们一直渴望的模块化。
在不久的将来,Iceoryx2 将支持至少与 iceoryx 相同的功能集和平台,确保无缝过渡并提供增强的进程间通信功能。因此,如果您正在寻找快速、跨平台的通信,且不牺牲性能或模块化,Iceoryx2 就是您的答案。
性能
机制比较
基准系统
- CPU: AMD Ryzen 7 7840S 配备 Radeon 780M 显卡
- 操作系统: Linux 6.8.5-arch1-1 #1 SMP PREEMPT_DYNAMIC GNU/Linux
- 编译器
- rustc 1.77.1
- gcc 13.2.1 20230801
架构比较
入门
发布/订阅
此最小示例展示了每秒发送数字 1234 的发布者,而订阅者有效地接收并打印数据。
publisher.rs
use core::time::Duration;
use iceoryx2::prelude::*;
const CYCLE_TIME: Duration = Duration::from_secs(1);
fn main() -> Result<(), Box<dyn std::error::Error>> {
let service_name = ServiceName::new("My/Funk/ServiceName")?;
let service = zero_copy::Service::new(&service_name)
.publish_subscribe()
.open_or_create::<usize>()?;
let publisher = service.publisher().create()?;
while let Iox2Event::Tick = Iox2::wait(CYCLE_TIME) {
let sample = publisher.loan_uninit()?;
let sample = sample.write_payload(1234);
sample.send()?;
}
Ok(())
}
subscriber.rs
use core::time::Duration;
use iceoryx2::prelude::*;
const CYCLE_TIME: Duration = Duration::from_secs(1);
fn main() -> Result<(), Box<dyn std::error::Error>> {
let service_name = ServiceName::new("My/Funk/ServiceName")?;
let service = zero_copy::Service::new(&service_name)
.publish_subscribe()
.open_or_create::<usize>()?;
let subscriber = service.subscriber().create()?;
while let Iox2Event::Tick = Iox2::wait(CYCLE_TIME) {
while let Some(sample) = subscriber.receive()? {
println!("received: {:?}", *sample);
}
}
Ok(())
}
此示例是 发布/订阅示例 的简化版本。您可以通过打开两个终端并调用
终端 1
cargo run --example publish_subscribe_publisher
终端 2
cargo run --example publish_subscribe_subscriber
事件
这个最小示例展示了两个进程之间的事件通知。
notifier.rs
use core::time::Duration;
use iceoryx2::prelude::*;
const CYCLE_TIME: Duration = Duration::from_secs(1);
fn main() -> Result<(), Box<dyn std::error::Error>> {
let event_name = ServiceName::new("MyEventName")?;
let event = zero_copy::Service::new(&event_name)
.event()
.open_or_create()?;
let notifier = event.notifier().create()?;
let id = EventId::new(12);
while let Iox2Event::Tick = Iox2::wait(CYCLE_TIME) {
notifier.notify_with_custom_event_id(id)?;
println!("Trigger event with id {:?} ...", id);
}
Ok(())
}
listener.rs
use core::time::Duration;
use iceoryx2::prelude::*;
const CYCLE_TIME: Duration = Duration::from_secs(1);
fn main() -> Result<(), Box<dyn std::error::Error>> {
let event_name = ServiceName::new("MyEventName")?;
let event = zero_copy::Service::new(&event_name)
.event()
.open_or_create()?;
let listener = event.listener().create()?;
while let Iox2Event::Tick = Iox2::wait(Duration::ZERO) {
if let Ok(Some(event_id)) = listener.timed_wait_one(CYCLE_TIME) {
println!("event was triggered with id: {:?}", event_id);
}
}
Ok(())
}
listener.rs 同时抓取所有事件
use core::time::Duration;
use iceoryx2::prelude::*;
const CYCLE_TIME: Duration = Duration::from_secs(1);
fn main() -> Result<(), Box<dyn std::error::Error>> {
let event_name = ServiceName::new("MyEventName")?;
let event = zero_copy::Service::new(&event_name)
.event()
.open_or_create()?;
let listener = event.listener().create()?;
while let Iox2Event::Tick = Iox2::wait(Duration::ZERO) {
listener.timed_wait_all(
|event_id| {
println!("event was triggered with id: {:?}", event_id);
},
CYCLE_TIME,
)?;
}
Ok(())
}
此示例是事件示例的简化版本。您可以通过打开两个终端并调用
终端 1
cargo run --example event_notifier
终端 2
cargo run --example event_listener
自定义配置
您可以在自定义配置文件中配置默认的服务质量设置、路径和文件后缀。更多详情请访问配置目录。
支持的平台
当需要时可以调整支持级别。
操作系统 | 状态 | 当前支持级别 | 目标支持级别 |
---|---|---|---|
Android | 计划中 | - | 一级 |
FreeBSD | 完成 | 二级 | 一级 |
FreeRTOS | 计划中 | - | 二级 |
iOS | 计划中 | - | 二级 |
Linux (x86_64) | 完成 | 二级 | 一级 |
Linux (aarch64) | 完成 | 二级 | 一级 |
Linux (32-bit) | 进行中 | 三级 | 一级 |
Mac OS | 完成 | 二级 | 二级 |
QNX | 计划中 | - | 一级 |
WatchOS | 计划中 | - | 二级 |
Windows | 完成 | 二级 | 二级 |
- 一级 - 所有安全和安全特性均正常工作。
- 二级 - 在受限的安全和功能集下工作。
- 三级 - 在开发中。可能可以编译和运行,也可能不行。
语言绑定
语言 | 状态 |
---|---|
C / C++ | 计划中 |
Lua | 计划中 |
Python | 计划中 |
Zig | 计划中 |
商业支持
[email protected] |
|
感谢所有贡献者
Christian „elfenpiff“ Eltzschig |
Mathias „elBoberido“ Kraus |
依赖项
~2–14MB
~128K SLoC