Expand description
§Worker Manager Module
This module provides the WorkerManager struct for controlling spawned threads.
It allows you to manage individual workers: pause, resume, remove, and monitor them.
§Overview
WorkerManager is designed to work with the spawn_workers! macro and provides
fine-grained control over thread management. It’s particularly useful for:
- Dynamic worker management: Add/remove workers at runtime
- Worker state control: Pause/resume individual workers
- Monitoring: Track worker status and count
- Synchronization: Wait for all workers to complete
§Key Features
- 🔄 Dynamic Worker Management: Add/remove workers programmatically
- ⏸️ State Control: Pause/resume individual workers
- 📊 Real-time Monitoring: Track worker status and count
- 🔒 Thread Safety: All operations are thread-safe
- 🎮 Fine-grained Control: Manage each worker individually
- 📈 Scalability: Handle hundreds of workers efficiently
§Basic Usage
use thread_share::{enhanced_share, spawn_workers};
// Create shared data
let data = enhanced_share!(0u32);
// Spawn workers and get manager
let manager = spawn_workers!(data, {
counter: |data| {
for i in 1..=10 {
data.update(|x| *x += i);
std::thread::sleep(std::time::Duration::from_millis(100));
}
},
monitor: |data| {
for _ in 0..5 {
std::thread::sleep(std::time::Duration::from_millis(200));
println!("Value: {}", data.get());
}
}
});
// Control workers
println!("Active workers: {}", manager.active_workers());
println!("Worker names: {:?}", manager.get_worker_names());
// Wait for completion
manager.join_all().expect("Workers failed");§Advanced Usage with Programmatic Worker Addition
use thread_share::{enhanced_share, spawn_workers, worker_manager::WorkerManager};
use std::thread;
let data = enhanced_share!(0u32);
// Start with initial workers
let manager = spawn_workers!(data, {
initial_worker: |data| {
data.update(|x| *x += 1);
std::thread::sleep(std::time::Duration::from_millis(100));
}
});
// Add more workers programmatically
let data_clone = data.clone();
let handle = thread::spawn(move || {
for _ in 0..3 {
data_clone.update(|x| *x *= 2);
std::thread::sleep(std::time::Duration::from_millis(150));
}
});
manager.add_worker("dynamic_worker", handle).expect("Failed to add worker");
// Now we have 2 workers
assert_eq!(manager.active_workers(), 2);§Creating Empty Manager and Adding Workers
use thread_share::worker_manager::WorkerManager;
use std::thread;
use std::time::Duration;
// Create empty manager
let manager = WorkerManager::new();
// Add workers one by one
let handle1 = thread::spawn(|| {
for i in 1..=5 {
println!("Worker 1: {}", i);
thread::sleep(Duration::from_millis(100));
}
});
let handle2 = thread::spawn(|| {
for i in 1..=3 {
println!("Worker 2: {}", i);
thread::sleep(Duration::from_millis(150));
}
});
manager.add_worker("worker1", handle1).expect("Failed to add worker1");
manager.add_worker("worker2", handle2).expect("Failed to add worker2");
assert_eq!(manager.active_workers(), 2);
println!("Worker names: {:?}", manager.get_worker_names());
// Wait for completion
manager.join_all().expect("Workers failed");§Worker Lifecycle Management
use thread_share::{enhanced_share, spawn_workers};
let data = enhanced_share!(0u32);
let manager = spawn_workers!(data, {
worker1: |data| { /* work */ },
worker2: |data| { /* work */ }
});
// Pause a worker
manager.pause_worker("worker1").expect("Failed to pause");
// Check if paused
assert!(manager.is_worker_paused("worker1"));
// Resume a worker
manager.resume_worker("worker1").expect("Failed to resume");
// Remove from tracking
manager.remove_worker("worker2").expect("Failed to remove");
// Remove all workers
manager.remove_all_workers().expect("Failed to remove all");§Error Handling
All methods return Result<T, String> for proper error handling:
use thread_share::{enhanced_share, spawn_workers};
let data = enhanced_share!(0u32);
let manager = spawn_workers!(data, {
worker: |data| { /* work */ }
});
// Handle errors gracefully
match manager.pause_worker("nonexistent") {
Ok(()) => println!("Worker paused successfully"),
Err(e) => println!("Failed to pause worker: {}", e),
}
// Remove worker and handle result
match manager.remove_worker("worker") {
Ok(()) => println!("Worker removed successfully"),
Err(e) => println!("Failed to remove worker: {}", e),
}§Thread Safety
WorkerManager is designed to be thread-safe and can be shared between threads:
use thread_share::{enhanced_share, spawn_workers};
use std::thread;
use std::sync::Arc;
let data = enhanced_share!(0u32);
let manager = spawn_workers!(data, {
worker: |data| { /* work */ }
});
// Clone manager for another thread
let manager_clone = manager.clone();
let thread_handle = thread::spawn(move || {
// Use manager in another thread
let names = manager_clone.get_worker_names();
println!("Worker names from thread: {:?}", names);
});
thread_handle.join().expect("Thread failed");§Performance Considerations
- Thread Spawning: Minimal overhead over standard
thread::spawn - Worker Management: Constant-time operations for most management functions
- Memory Usage: Small overhead for worker tracking structures
- Scalability: Efficient for up to hundreds of workers
§When to Use WorkerManager
- Complex Applications: When you need fine-grained control over workers
- Dynamic Workloads: When worker count changes at runtime
- Monitoring Requirements: When you need real-time worker status
- Production Systems: When you need robust worker management
- Debugging: When you need to pause/resume workers for debugging
Structs§
- Worker
Manager - Worker Manager for controlling spawned threads