Crate rust_pubsub

Source
Expand description

§Rust PubSub

A thread-safe, in-memory publish-subscribe library for Rust, designed for efficient and flexible inter-thread communication. It supports both manual message receiving and callback-based subscriptions, with configurable queue depth and overwrite behavior.

§Features

  • Thread-Safe: Uses crossbeam-channel for safe message passing between threads.
  • Flexible Subscriptions: Supports manual message receiving and callback-based subscriptions.
  • Configurable Channels: Allows customization of queue depth and overwrite behavior per subscription.
  • Type-Safe Messaging: Supports any Send + Sync + Clone + 'static type for messages.
  • Timeout Support: Provides blocking, non-blocking, and timeout-based message receiving and publishing.

§功能(中文)

  • 线程安全:使用 crossbeam-channel 实现线程间安全消息传递。
  • 灵活订阅:支持手动消息接收和基于回调的订阅模式。
  • 可配置通道:允许为每个订阅配置队列深度和覆盖行为。
  • 类型安全消息:支持任何满足 Send + Sync + Clone + 'static 的消息类型。
  • 超时支持:提供阻塞、非阻塞和带超时的消息接收与发布。

§Usage Examples

§1. Manual Subscription with Non-Blocking Receive

use rust_pubsub::{PubSub, TopicConfig};

let pubsub = PubSub::instance();
let topic = "test_topic";
let config = TopicConfig::new(10, false); // Queue depth 10, no overwrite

// Create publisher
let topic_id = pubsub.create_publisher(topic);

// Subscribe manually
let receiver = pubsub.subscribe_manual::<String>(topic, config);

// Publish a message
pubsub.publish(topic_id, "Hello, World!".to_string());

// Try to receive the message
if let Some(msg) = receiver.try_recv() {
    println!("Received: {}", msg);
}

§2. Callback-Based Subscription

use rust_pubsub::{PubSub, TopicConfig};

let pubsub = PubSub::instance();
let topic = "callback_topic";
let config = TopicConfig::new(5, true); // Queue depth 5, overwrite enabled

// Create publisher
let topic_id = pubsub.create_publisher(topic);

// Subscribe with a callback
let subscriber_id = pubsub.subscribe::<String, _>(topic, config, |msg: &String| {
    println!("Callback received: {}", msg);
});

// Publish a message
pubsub.publish(topic_id, "Callback message".to_string());

// Wait briefly to ensure callback executes
std::thread::sleep(std::time::Duration::from_millis(100));

// Unsubscribe
pubsub.unsubscribe(&subscriber_id);

§3. Publishing with Timeout

use rust_pubsub::{PubSub, TopicConfig};

let pubsub = PubSub::instance();
let topic = "timeout_topic";
let config = TopicConfig::new(1, false); // Queue depth 1, no overwrite

// Create publisher
let topic_id = pubsub.create_publisher(topic);

// Subscribe manually
let receiver = pubsub.subscribe_manual::<i32>(topic, config);

// Publish with timeout (100ms)
pubsub.publish_with_timeout(topic_id, 42, Some(100));

// Receive with timeout (100ms)
if let Some(msg) = receiver.recv_timeout(Some(100)) {
    println!("Received: {}", msg);
}

§4. Overwrite Mode with Full Queue

use rust_pubsub::{PubSub, TopicConfig};

let pubsub = PubSub::instance();
let topic = "overwrite_topic";
let config = TopicConfig::new(2, true); // Queue depth 2, overwrite enabled

// Create publisher
let topic_id = pubsub.create_publisher(topic);

// Subscribe manually
let receiver = pubsub.subscribe_manual::<String>( کمپل, config);

// Publish multiple messages to fill queue
pubsub.publish(topic_id, "Message 1".to_string());
pubsub.publish(topic_id, "Message 2".to_string());
pubsub.publish(topic_id, "Message 3".to_string()); // Overwrites oldest

// Receive messages
while let Some(msg) = receiver.try_recv() {
    println!("Received: {}", msg);
}

§5. Multiple Subscribers

use rust_pubsub::{PubSub, TopicConfig};

let pubsub = PubSub::instance();
let topic = "multi_subscriber_topic";
let config = TopicConfig::new(10, false);

// Create publisher
let topic_id = pubsub.create_publisher(topic);

// Subscribe multiple times
let receiver1 = pubsub.subscribe_manual::<String>(topic, config.clone());
let receiver2 = pubsub.subscribe_manual::<String>(topic, config.clone());

// Publish a message
pubsub.publish(topic_id, "Broadcast message".to_string());

// Receive from both subscribers
println!("Receiver 1: {:?}", receiver1.try_recv());
println!("Receiver 2: {:?}", receiver2.try_recv());

§Installation

Add the following to your Cargo.toml:

[dependencies]
rust-pubsub = "0.1.0"

§安装(中文)

在您的 Cargo.toml 中添加以下内容:

[dependencies]
rust-pubsub = "0.1.0"

§License

Licensed under either of Apache License, Version 2.0 or MIT license at your option.

Structs§

ManualReceiver
PubSub
TopicConfig