#channel #thread #mpmc #distributed #async #aerospace

crosstalk

一个极轻量级的、基于主题的、跨线程、内存通信库

3 个不稳定版本

0.2.7 2024年6月6日
0.2.6 2024年3月25日
0.1.4 2024年3月12日
0.1.3 2024年2月27日

#414并发

每月下载量 34

MIT 许可证

43KB
361 代码行

crosstalk

LICENSE Crates.io Version

crosstalk 是对 tokio 的有界广播通道的轻量级包装,以实现基于主题(发布者/订阅者)的 mpmc 通信模式。

#![allow(dead_code)]

use std::thread;
use std::collections::HashMap;
use crosstalk::AsTopic;

#[derive(AsTopic)] // required for crosstalk topic
enum TopicZoo {
    Topic1,
    Topic2,
    Topic3,
    Topic4,
    Topic5,
    Topic6,
}

#[derive(Clone)] // required for crosstalk data
#[derive(PartialEq, Debug)]
struct Vehicle {
    make: String,
    model: String,
    color: Color,
    wheels: u8,
}

#[derive(Clone)] // required for crosstalk data
#[derive(PartialEq, Debug)]
enum Color {
    Red,
    Blue,
    Green
}

crosstalk::init! {
    TopicZoo::Topic1 => Vec<u32>,
    TopicZoo::Topic2 => String,
    TopicZoo::Topic3 => Vehicle,
    TopicZoo::Topic4 => HashMap<&str, Vec<Vehicle>>,
    TopicZoo::Topic5 => Color,
}
// TopicZoo::Topic6 not included: defaults to String

fn main() {
    let mut node = crosstalk::BoundedNode::<TopicZoo>::new(1024);

    let (pub0_topic5, mut sub0_topic5) = node
        .pubsub(TopicZoo::Topic5)
        .unwrap();
    let mut sub1_topic5 = node
        .subscriber(TopicZoo::Topic5)
        .unwrap();

    let message = Color::Red;

    thread::spawn(move || { pub0_topic5.write(message); });

    let received_0 = sub0_topic5.read_blocking();
    let received_1 = sub1_topic5.read_blocking();

    println!("{:?}", received_0);
    println!("{:?}", received_1);
    assert_eq!(received_0, received_1);
}

为什么是 crosstalk?

大多数 mpmc 库专注于单个 FIFO 通道,而不是广播。 Tokio 是唯一支持广播的几个已建立的 mpmc / 异步库之一,因此动机是将 tokio 的通道包装在基于主题的模式中,类似于 ROS,以便于使用。 Crosstalk 作为 tokio::sync::broadcast 的轻量级包装,将主题枚举与数据类型和发送者/接收者相关联。 Crosstalk 可以用于在运行时动态创建和销毁发布者和订阅者,跨越多个线程。

许可证

Crosstalk 在 MIT 许可证下发布 http://opensource.org/licenses/MIT

依赖项

~3.5–5.5MB
~88K SLoC