Планировщик задач на C++: TaskFlow, CronCpp, Boost.Asio

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Планировщик задач на C++: Обзор и примеры использования

В современной разработке на C++ часто возникает необходимость выполнять определённые действия по расписанию, с задержкой или периодически. Для этого используются планировщики задач (task schedulers). В этой статье мы рассмотрим три популярных подхода и библиотеки для реализации планировщика задач на C++: TaskFlow, CronCpp и Boost.Asio. Вы узнаете, как выбрать подходящий инструмент для вашего проекта, и увидите примеры кода.

Зачем нужен планировщик задач?

Планировщик задач позволяет:

  • Выполнять фоновые операции в определённое время (например, очистка кэша в 3:00).
  • Запускать периодические задачи с заданным интервалом (например, опрос датчика каждые 5 секунд).
  • Откладывать выполнение задачи на определённое время.
  • Управлять параллельным выполнением задач с учётом зависимостей.

1. TaskFlow — современный планировщик с графом задач

TaskFlow — это библиотека для построения графов задач с поддержкой планирования и параллельного выполнения. Она особенно полезна, когда задачи зависят друг от друга и их нужно выполнять в определённом порядке.

Основные возможности TaskFlow:

  • Построение направленных ациклических графов (DAG) задач.
  • Поддержка условных и циклических зависимостей.
  • Автоматическое распределение задач по потокам.
  • Встроенная поддержка таймеров и задержек.

Пример: простая задача с задержкой

#include <taskflow/taskflow.hpp>
#include <iostream>
#include <chrono>

int main() {
    tf::Executor executor;
    tf::Taskflow taskflow;

    // Создаём задачу с задержкой в 2 секунды
    auto [A, timer] = taskflow.emplace([](){
        std::cout << "Задача A выполнена через 2 секунды" << std::endl;
    });

    // Настраиваем таймер
    timer.name("timer");
    timer.silent_delay(std::chrono::seconds(2));

    // Запускаем планировщик
    executor.run(taskflow).wait();
    return 0;
}

Этот код создаёт задачу, которая выполнится через 2 секунды после запуска планировщика. TaskFlow автоматически управляет потоками и временем.

2. CronCpp — лёгкий планировщик с cron-синтаксисом

CronCpp — это минималистичная библиотека для планирования задач по cron-расписанию. Она идеально подходит, если вам нужно задавать время выполнения в привычном формате (как в Linux cron).

Основные возможности CronCpp:

  • Поддержка стандартного cron-синтаксиса (минуты, часы, дни, месяцы, дни недели).
  • Лёгкий вес — не требует Boost или других тяжеловесных зависимостей.
  • Простой API для добавления и удаления задач.

Пример: задача каждую минуту

#include <croncpp/croncpp.h>
#include <iostream>
#include <thread>
#include <chrono>

int main() {
    cron::Cron cron;
    
    // Добавляем задачу, которая выполняется каждую минуту
    cron.schedule("* * * * *", [](){
        std::cout << "Задача выполняется каждую минуту!" << std::endl;
    });

    // Запускаем планировщик в фоновом потоке
    std::thread cron_thread([&cron](){
        cron.start();
    });

    // Даём поработать 5 минут
    std::this_thread::sleep_for(std::chrono::minutes(5));
    
    cron.stop();
    cron_thread.join();
    return 0;
}

В этом примере задача будет выполняться каждую минуту. CronCpp автоматически вычисляет время следующего запуска и вызывает функцию.

3. Boost.Asio — мощный планировщик для асинхронных задач

Boost.Asio — это не просто планировщик, а полноценная библиотека для асинхронного программирования. Её таймеры и планировщики задач широко используются в высоконагруженных системах.

Основные возможности Boost.Asio для планирования:

  • Поддержка абсолютных и относительных таймеров (deadline_timer, steady_timer).
  • Возможность отмены задачи в любой момент.
  • Интеграция с многопоточностью и сетевыми операциями.
  • Высокая производительность и надёжность.

Рекомендаций