<?php
class TaskQueue {
private $queue = [];
private $max_tasks = 10; // Limit number of tasks in the queue
public function enqueue(string $dataset_name, callable $task_function) {
// Add task to the queue
$this->queue[] = [
'dataset' => $dataset_name,
'task' => $task_function,
];
// Limit queue size
if (count($this->queue) > $this->max_tasks) {
$this->dequeue(); // Remove the oldest task if queue is full
}
}
private function dequeue() {
if (!empty($this->queue)) {
array_shift($this->queue); // Remove the first element (oldest task)
}
}
public function process() {
while (!empty($this->queue)) {
$task = array_shift($this->queue); // Get the next task
$dataset_name = $task['dataset'];
$task_function = $task['task'];
try {
// Basic sanity checks
if (empty($dataset_name)) {
throw new Exception("Dataset name cannot be empty.");
}
if (!is_callable($task_function)) {
throw new Exception("Task function is not callable.");
}
// Execute the task
$task_function($dataset_name); // Execute the task with the dataset name
echo "Processed dataset: $dataset_name\n"; // Log the processing
} catch (Exception $e) {
echo "Error processing dataset $dataset_name: " . $e->getMessage() . "\n"; // Log errors
}
}
}
public function getQueueSize(): int {
return count($this->queue);
}
}
// Example usage:
// Define some dummy task functions
function processDataset1(string $dataset_name) {
echo "Simulating processing of dataset: $dataset_name\n";
// Add your actual dataset processing logic here
}
function processDataset2(string $dataset_name) {
echo "Simulating processing of dataset: $dataset_name\n";
}
// Create a TaskQueue instance
$queue = new TaskQueue();
// Enqueue some tasks
$queue->enqueue("data_set_a", 'processDataset1');
$queue->enqueue("data_set_b", 'processDataset2');
$queue->enqueue("data_set_c", function (string $dataset_name) {
echo "Custom processing of dataset: $dataset_name\n";
});
$queue->enqueue("data_set_d", 'processDataset1');
$queue->enqueue("data_set_e", 'processDataset2');
$queue->enqueue("data_set_f", function (string $dataset_name) {
echo "Custom processing of dataset: $dataset_name\n";
});
$queue->enqueue("data_set_g", 'processDataset1');
$queue->enqueue("data_set_h", 'processDataset2');
$queue->enqueue("data_set_i", function (string $dataset_name) {
echo "Custom processing of dataset: $dataset_name\n";
});
$queue->enqueue("data_set_j", 'processDataset1'); //Will trigger dequeue, as queue is now at max size.
// Process the queue
$queue->process();
?>
Add your comment