Crates.io | crosstalk |
lib.rs | crosstalk |
version | 0.2.7 |
source | src |
created_at | 2024-02-20 01:35:46.792491 |
updated_at | 2024-06-06 02:47:15.767438 |
description | An extremely lightweight, topic-based, cross-thread, in-memory communication library |
homepage | |
repository | https://github.com/arpadav/crosstalk |
max_upload_size | |
id | 1145846 |
size | 61,369 |
A lightweight wrapper of tokio's bounded broadcasting channels to enable topic-based (publisher/subscriber) paradigm of mpmc communication.
#![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);
}
Most mpmc libraries focuses on a single FIFO channel, rather than broadcasting. Tokio is one of the only established mpmc / async libraries that supports broadcasting, so the motivation was to wrap tokio
's channels with a topic-based paradigm, similar to ROS, for ease of use. Crosstalk acts as a lightweight wrapper of tokio::sync::broadcast
, correlating topic enums with datatypes and senders/receivers. Crosstalk can be used to dynamically create and destroy publishers and subscribers at runtime, across multiple threads.
Crosstalk is released under the MIT license http://opensource.org/licenses/MIT