8000 GitHub - mambaru/wflow: Wamba Workflow - потоки, очереди и таймеры на базе boost::asio::io_service
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content
/ wflow Public

Wamba Workflow - потоки, очереди и таймеры на базе boost::asio::io_service

License

Notifications You must be signed in to change notification settings

mambaru/wflow

Repository files navigation

tag Build Status Build Status Build Status Build Status codecov

Библиотека на базе boost::asio для работы с потоками и очередями, с возможностью динамического реконфигурирования и удобными таймерами.

Сборка и установка

Usage:
        make help
        make shared
        make static
        make tests

Если установлен doxygen то в папке /docs/html будет документация.

Для сборки примеров и тестов, а также чтобы отключить поддержку JSON-конфигурации и/или логирования :

git clone https://github.com/mambaru/wflow.git
mkdir wflow/build
cd wflow/build
cmake ..
# Для сборки примеров и тестов
cmake -DBUILD_TESTING=ON ..
# Если поддержка JSON-конфигурации не требуется
#   cmake -DWFLOW_DISABLE_JSON=ON -DWLOG_DISABLE_JSON=ON ..
# Если поддержка логирования не требуется
#   cmake -DWFLOW_DISABLE_LOG=ON ..
cmake --build make
ctest

Для компиляции с поддержкой JSON-конфигурации потребуются библиотеки faslib, wjson, wlog, которые система сборки автоматически клонирует в директорию проекта, если не найдет их в системе.

Некоторые примеры

Все примеры с описанием в examples.

Гарантированное выполнение заданий:

int main()
{
  boost::asio::io_context ios;
  wflow::workflow wf(ios);

  // Простое задание
  wf.safe_post( [](){ std::cout << "Simple safe post  " << std::endl; } );

  // Отложенное задание
  wf.safe_post( std::chrono::seconds(4), [](){ std::cout << "Safe post after delay 4 second " << std::endl; } );

  // Задание на конкретный момент времени
  auto tp = std::chrono::system_clock::now();
  tp += std::chrono::seconds(2);
  wf.safe_post( tp, [](){ std::cout << "Safe post in time point" << std::endl; } );

  // Ожидаем выполнение всех заданий
  ios.run();
}

Пример ограничения размера очереди:

int main()
{
  boost::asio::io_context ios;
  wflow::workflow_options opt;
  opt.maxsize = 5;
  wflow::workflow wf(ios, opt);

  for (int i = 0; i < 10; ++i)
  {
    wf.post(
      [i](){ std::cout << "post " << i << std::endl; },
      [i](){ std::cout << "drop " << i << std::endl; }
    );
  }

  std::cout << "Run!" << std::endl;
  // Ожидаем выполнение всех заданий
  ios.run();
}

Различные варианты таймеров:

  boost::asio::io_context ios;
  wflow::workflow wf(ios);

  // простой таймер
  wf.create_timer(
    std::chrono::seconds(5),
    []()->bool{
      std::cout << "Every 5 seconds" << std::endl;
      // Продолжаем работу таймера
      return true;
    }
  );

  // Запускаем пятисекундный таймер через 30 секунд
  wf.create_timer(
    std::chrono::seconds(30),
    std::chrono::seconds(5),
    []()->bool{
      std::cout << "Every 5 seconds" << std::endl;
      return true;
    }
  );

  // Запускаем раз в сутки в 5 утра
  wf.create_timer(
    "05:00:00",
    []()->bool{
      std::cout << "Every day at 5:00 am" << std::endl;
      return true;
    }
  );

  // Первый запуск в 3 утра, далее каждые 6 часов
  wf.create_timer(
    "03:00:00",
    std::chrono::hour(6),
    []()->bool{
      std::cout << "Every six hour" << std::endl;
      return true;
    }
  );

  ios.run();

Пример тестирования пропускной способности (порядка 3 млн в секунду) см. example9 и example10

  boost::asio::io_context ios;
  boost::asio::executor_work_guard<boost::asio::io_context::executor_type> wrk(ios);
  wflow::workflow_options opt;
  opt.threads = 1;
  wflow::workflow wf(ios, opt);
  wf.start();
  std::atomic<bool> run(true);
  size_t counter = 0;

  std::thread t([&run, &wf, &counter](){
    for (;run; ++counter)
      wf.post([](){});
  });

  wf.safe_post( std::chrono::seconds(10), [&ios, &run](){ ios.stop(); run = false;});
  ios.run();
  t.join();
  std::cout << counter/10 << std::endl;

About

Wamba Workflow - потоки, очереди и таймеры на базе boost::asio::io_service

Resources

License

Stars

Watchers

Forks

Packages

No packages published
0