Я хочу написать планировщик заданий на C ++ (в среде Linux), который берет карту JobID и Job (std :: map) и вызывает функцию, связанную с заданием, как только запланированное время достигнуто.
Структура данных задания будет выглядеть примерно так:
enum Type {Scheduled,Periodic,Event};
typedef int JobId;
class View
{
void callback(T results);
};
typedef vector<View> Views;
typename <class T>
typedef struct
{
Type type;
unsigned int epochTime;
unsigned int period;
std::function func;
int timeout;
T result;
Views views;
}Job;
std::map<JobId, Job> Jobs; //Data structure to add a job schedule
В зависимости от данных в std :: map планировщик должен иметь возможность вызывать функцию, связанную с заданием:
- в заданный период времени (если тип установлен по расписанию)
- периодически.(Например, каждые XX секунд, если тип периодический)
- , как только новый объект добавлен в std :: map (если тип - Событие)
Функция, связанная с«Запланированное» задание:
int scheduledTime(int x,int y)
{
sleep(5); //Processing takes 5 seconds
return (x*y);
}
Функция, связанная с «Периодическим» заданием:
int periodic(int x,int y)
{
sleep(2); //Processing takes 2 seconds
return (x+y);
}
Функция, связанная с заданием «Событие»:
void eventbased()
{
sleep(15); //Processing takes 15 seconds
}
В основной функции я должен иметь возможность создавать расписания заданий следующим образом: (См. Комментарии в основной функции)
int main()
{
Jobs jobs;
//Scenario 1 (Scheduled Timer)
Job job1;
Views view1;
job1.type = Scheduled;
job1.epochTime = 1538390376;
job1.timeout = 10;
job1.period = 0;
job1.func = scheduledTime;
job1.views.insert(view1);
jobs[1] = job1;
Это должно асинхронно выполнять функцию запланированное время в 1538390376 эпох.Функция add занимает 2 секунды, чтобы обработать результат.Как только результат станет доступен, подписчики (в данном случае view1) должны быть уведомлены с помощью функции обратного вызова.
//Scenario 2 (Periodic Timer)
Job job2;
Views view11,view12;
job2.type = Periodic;
job2.epochTime = 0;
job1.timeout = 15;
job2.period = 10;
job2.func = periodic;
job2.views.insert(view21);
job2.views.insert(view22);
jobs[2] = job2;
Это должно асинхронно выполнять функцию периодически каждые 10 секунд.Функция add занимает 5 секунд, чтобы обработать результат.Как только результат станет доступен, подписчики (здесь view21 и view22) должны быть уведомлены с помощью функции обратного вызова.
//Scenario 3 (Event Timer)
Job job3;
Views view31,view32;
job3.type = Event;
job3.epochTime = 0;
job1.timeout = 20;
job3.period = 5;
job3.func = eventbased;
job3.views.insert(view31);
job3.views.insert(view32);
jobs[3] = job3;
}
Это должно асинхронно выполнить функцию, основанную на событиях, через 5 секунд.Для выполнения функции, основанной на событиях, требуется 15 секунд, после чего подписчики (в данном случае view31 и view32) должны быть уведомлены с помощью функции обратного вызова.
Примечание. Задания могут добавляться / удаляться / обновляться динамически, без необходимости перезапуска существующего запуска.планировщик.