По предварительному плану работ над версией 5.6.0 предполагалось, что к концу марта 2019-го должна появится первая бета-версия SObjectizer-5.6. На данный момент очевидно, что этого не произойдет. Поэтому есть смысл обозначить что в SObjectizer-5.6 уже было сделано и что еще предстоит сделать.
Итак, вот какие изменения уже произошли в SObjectizer-5.6 по сравнению с SObjectizer-5.5:
- для отсылки сообщений теперь используются только send-функции. Теперь нет доступа к методам deliver_message из mbox-ов;
- внутри каждого mbox-а теперь хранится ссылка на environment_t, что сделало возможным привести все функции send_periodic и send_delayed к одному формату. Т.е. теперь send_delayed(target_agent, pause, args) выглядит так же, как и send_delayed(target_mbox, pause, args);
- в SObjectizer-5.6 нет больше ad-hoc агентов;
- в SObjectizer-5.6 нет больше поддержки tuple_as_message;
- в SObjectizer-5.6 нет больше методов, которые принимают "голые" указатели. Например, coop_t::add_agent и environment_t::register_agent_as_coop теперь ожидают только unique_ptr;
- функции introduce_coop и introduce_child_coop теперь возвращают значения. Возвращается то значение, которое возвратила переданная в эти функции лямбда;
- переделан механизм диспетчеров. Теперь нет публичных и приватных диспетчеров. Новые диспетчеры очень похожи на приватные диспетчеры из SO-5.5: создаются самим разработчиком когда они ему нужды и автоматически удаляются SObjectizer-ом когда больше диспетчеры никем не используются. Общая же концепция привязки агентов к диспетчерам не изменилась: по-прежнему существуют disp_binder-ы, которые связывают агентов с диспетчерам. Только сейчас манипуляции с disp_binder-ами производятся через shared_ptr, а не через unique_ptr. Что позволяет использовать один и тот же disp_binder для привязки разных агентов из разных коопераций к одному и тому же диспетчеру;
- существенно переделан механизм коопераций в SObjectizer-а. Сами кооперации никуда не делись и кооперации можно увязывать во взаимоотношения "родитель-потомок". Но у коопераций теперь нет имен. Метод register_coop() возвращает специальный дескриптор зарегистрированной кооперации (экземпляр типа coop_handle_t). Этот дескриптор затем может использоваться как для создания дочерних коопераций, так и для дерегистрации ненужных уже коопераций. Данный механизм не быстрее, чем его аналог из SO-5.5, но гораздо лучше масштабируется, когда в приложении одновременно регистрируются и дерегистрируются кооперации на разных рабочих потоках. Например, новый бенчмарк parallel_parent_child на моем ноутбуке для версии 5.5.24.3 показывает время 44s, а для версии 5.6.0 -- 11s. Это результаты для следующих значений параметров: roots=3, levels=5, level-size=9.
Что еще предстоит сделать в версии 5.6.0:
- переделать механизм синхронного взаимодействия между агентами (этот вопрос рассматривался здесь);
- провести окончательную доводку (тестирование, профилирование, приведение в актуальное состояние Doxygen-комментариев).
После чего останется работа по написанию документации для версии 5.6.0. А также выпуск адаптированной под SObjectizer-5.6 версии so_5_extra.
Почему не удалось уложиться в ранее определенный срок?
Переделка механизма коопераций заняла более чем в 2.5 раза больше времени, чем ожидалось.
Каковы сейчас планы релиза версии 5.6.0?
К сожалению, в ближайшую неделю в работе над SObjectizer-5.6 придется взять паузу, чтобы закрыть ряд вопросов по другим нашим проектам. Поэтому можно ожидать, что работа над версией 5.6.0 возобновиться в первых числах апреля 2019. А релиз первой бета-версии, при отсутствии серьезных проблем в реализации нового механизма синхронного взаимодействия между агентами, можно будет ожидать в середине апреля. В этом случае релиз SObjectizer-5.6 может произойти в начале мая 2019. Это оптимистичный сценарий, в котором работы над so_5_extra и обновленной документацией для SObjectizer-а происходят максимально быстро.