use tokio::runtime::Runtime;
use mini_executor::{TaskExecutor, BatchTask};
use std::sync::{Arc, Mutex};
#[derive(Clone)]
struct LogTask {
message: String,
storage: Arc<Mutex<Vec<String>>>,
}
impl BatchTask for LogTask {
async fn batch_run(list: Vec<Self>) {
let storage = list[0].storage.clone();
let mut logs = storage.lock().unwrap();
println!("Processing batch of {} log messages", list.len());
for task in list {
logs.push(format!("[BATCH] {}", task.message));
}
}
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let rt = Box::leak(Box::new(Runtime::new().unwrap()));
let executor = TaskExecutor::new(rt);
let storage = Arc::new(Mutex::new(Vec::new()));
rt.block_on(async {
executor.execute_batch_detached(LogTask {
message: "User logged in".to_string(),
storage: storage.clone(),
});
executor.execute_batch_detached(LogTask {
message: "Data processed".to_string(),
storage: storage.clone(),
});
executor.execute_batch_detached(LogTask {
message: "Cache updated".to_string(),
storage: storage.clone(),
});
executor.execute_batch_waiting(LogTask {
message: "Operation finished".to_string(),
storage: storage.clone(),
}).await?;
let logs = storage.lock().unwrap();
println!("Total logs processed: {}", logs.len());
for log in logs.iter() {
println!("{}", log);
}
Ok(())
})
}