Планировщик задач C ++ - PullRequest
       25

Планировщик задач C ++

0 голосов
/ 02 октября 2018

Я хочу написать планировщик заданий на 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) должны быть уведомлены с помощью функции обратного вызова.

Примечание. Задания могут добавляться / удаляться / обновляться динамически, без необходимости перезапуска существующего запуска.планировщик.

...