use std::collections::VecDeque;
use std::collections::{HashMap, BTreeMap};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ComputeType {
Rendering,
Physics,
AI,
Audio,
Network,
}
impl Default for ComputeType {
fn default() -> Self {
Self::Rendering
}
}
#[derive(Debug, Clone)]
pub struct EdgeConfig {
pub max_concurrent_tasks: u32,
pub task_timeout_ms: u64,
pub enable_load_balancing: bool,
}
impl Default for EdgeConfig {
fn default() -> Self {
Self {
max_concurrent_tasks: 100,
task_timeout_ms: 5000,
enable_load_balancing: true,
}
}
}
#[derive(Debug, Clone)]
pub struct EdgeTask {
pub id: String,
pub compute_type: ComputeType,
pub payload: Vec<u8>,
pub priority: u32,
}
#[derive(Debug, Clone)]
pub struct EdgeResult {
pub task_id: String,
pub data: Vec<u8>,
pub execution_time_ms: u64,
pub success: bool,
}
pub struct EdgeComputing {
config: EdgeConfig,
task_queue: VecDeque<EdgeTask>,
running_tasks: u32,
}
impl EdgeComputing {
pub fn new(config: EdgeConfig) -> Result<Self, EdgeError> {
Ok(Self {
config,
task_queue: VecDeque::new(),
running_tasks: 0,
})
}
pub fn dispatch_task(&mut self, task: EdgeTask) -> Result<String, EdgeError> {
if self.running_tasks >= self.config.max_concurrent_tasks {
self.task_queue.push_back(task.clone());
} else {
self.running_tasks += 1;
}
Ok(task.id)
}
pub fn pending_tasks(&self) -> usize {
self.task_queue.len()
}
pub fn running_tasks(&self) -> u32 {
self.running_tasks
}
pub fn complete_task(&mut self, _task_id: &str) -> Result<(), EdgeError> {
if self.running_tasks > 0 {
self.running_tasks -= 1;
}
if !self.task_queue.is_empty() && self.running_tasks < self.config.max_concurrent_tasks {
self.task_queue.pop_front();
self.running_tasks += 1;
}
Ok(())
}
}
#[derive(Debug, Clone)]
pub enum EdgeError {
InitializationFailed(String),
TaskFailed(String),
Timeout(String),
InsufficientResources,
}
impl std::fmt::Display for EdgeError {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::InitializationFailed(msg) => write!(f, "初始化失败: {}", msg),
Self::TaskFailed(msg) => write!(f, "任务失败: {}", msg),
Self::Timeout(msg) => write!(f, "超时: {}", msg),
Self::InsufficientResources => write!(f, "资源不足"),
}
}
}
impl std::error::Error for EdgeError {}