3 个不稳定版本
0.2.7 | 2024年6月6日 |
---|---|
0.2.6 | 2024年3月25日 |
0.1.4 | 2024年3月12日 |
0.1.3 |
|
#414 在 并发
每月下载量 34
43KB
361 代码行
crosstalk
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