четверг, 24 марта 2016 г.

[prog.c++11] Дальнейшая диверсификация SObjectizer?

С момента появления mchain-ов в версии 5.5.13 возможности SObjectizer-а по поддержке CSP-like concurrency потихонечку расширяются. Так, в грядущей версии 5.5.16 mchain-ы станут полноценными MPMC-каналами (т.е. сразу несколько нитей смогут читать сообщения из mchain-а). Плюс, конечно же, функция select, которая позволяет выбирать сообщения сразу из нескольких mchain-ов.

В связи с этим уже неправильно позиционировать SObjectizer как только лишь actor framework. Т.к. кроме actor model из коробки уже имеется поддержка и CSP channels.

А раз так, может пойти и еще дальше? И добавить в SObjectizer поддержку цепочек задач? Что-то вроде:

void initiate_image_processing(so_5::environment_t & env, image_params params)
{
   // Готовим цепочку задач и привязываем ее к уже созданному
   // thread_pool-диспетчеру с именем "tasks_pool".
   schedule( env,
      so_5::disp::thread_pool::create_disp_binder("tasks_pool", ...),
      make_task( env, [params]() -> so_5::task< loaded_image > {
         ... // Какие-то действия по загрузке картинки.
         return loaded_image{ ... };
      })
      .then([]( loaded_image & img ) -> so_5::task< prepared_image > {
         ... // Какая-то нехилая обработка.
         return prepared_image{ ... };
      })
      .then([]( prepared_image & img ) -> so_5::task< converted_image > {
         ... // Какая-то еще более нехилая обработка.
         return converted_image{ ... };
      })
      .then([params]( converted_image & img ) {
         ... // Ну совсем замороченная обработка.
         so_5::send< transformed_image >(params.dest(), ...);
      }) );
}

В принципе, все это можно уже сейчас проделать на агентах. Но приседаний должно быть больше. А вот если предоставить пользователю удобную и простую обертку, может кому и пригодится.

Понятное дело, что глубоко в эту тему я не копал. Но, думается, можно сделать что-то вроде Data Flow и Dependency Graphs из Intel-овской Threading Building Blocks или Task Parallelism из Microsoft-овской PPL. Вопрос только в том, нужно/интересно ли это кому-нибудь?

PS. Возможно, все это будет логичным продолжением прототипа для реактивного программирования средствами SO-5, только в другом синтаксисе.

Отправить комментарий