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网络编程

Download history 6/week @ 2024-04-26 2/week @ 2024-05-17 1/week @ 2024-05-24 9/week @ 2024-05-31 76/week @ 2024-06-07 25/week @ 2024-06-14 7/week @ 2024-06-21 10/week @ 2024-06-28 28/week @ 2024-07-05 20/week @ 2024-07-12 8/week @ 2024-07-19 48/week @ 2024-07-26 31/week @ 2024-08-02 13/week @ 2024-08-09

每月101次下载

MIT/Apache

1.5MB
29K SLoC

Benchmarks Changelog Crates.io Examples FAQ Gitter License Roadmap

iceoryx2 - 使用 Rust 实现的纯零拷贝无锁 IPC

  1. 简介
  2. 性能
  3. 入门
    1. 发布/订阅
    2. 事件
    3. 自定义配置
  4. 支持的平台
  5. 语言绑定
  6. 商业支持
  7. 感谢所有贡献者

简介

欢迎来到 Iceoryx2,这是一个高效且超低延迟的进程间通信中间件。该库旨在为您提供快速可靠的零拷贝和无锁进程间通信机制。

Iceoryx2 专注于提供无缝的进程间通信体验,具有多种消息模式。无论是深入到发布/订阅、事件,还是期待未来功能,如请求/响应、管道和黑板,Iceoryx2 都能满足您的需求。

Iceoryx2 的一个特点是无论负载大小如何,都能保持低传输延迟,确保可预测和可靠的通信体验。

Iceoryx2 的起源可以追溯到 iceoryx。通过解决过去的技术债务和优化架构,Iceoryx2 实现了我们一直渴望的模块化。

在不久的将来,Iceoryx2 将支持至少与 iceoryx 相同的功能集和平台,确保无缝过渡并提供增强的进程间通信功能。因此,如果您正在寻找快速、跨平台的通信,且不牺牲性能或模块化,Iceoryx2 就是您的答案。

性能

机制比较

benchmark of different mechanism

基准系统

  • 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

架构比较

benchmark on different systems

入门

发布/订阅

此最小示例展示了每秒发送数字 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 计划中

商业支持

ekxide IO GmbH
[email protected]
  • 商业扩展和工具
  • 定制功能开发
  • 培训和咨询
  • 集成支持
  • iceoryx生态系统相关的工程服务

感谢所有贡献者

Christian »elfenpiff« Eltzschig
Christian „elfenpiff“ Eltzschig
Mathias »elBoberido« Kraus
Mathias „elBoberido“ Kraus

依赖项

~2–14MB
~128K SLoC