суббота, 3 сентября 2016 г.

[prog.c++] Нововведения в SObjectizer-5.5.18: сообщения distribution_started и distribution_finished

Возможность получения мониторинговой информации о том, что происходит внутри SObjectizer Environment была добавлена довольно давно, еще в версии 5.5.4. Работает этот механизм на потактовой основе: пользователь может задать темп, с которым он хочет получать мониторинговую информацию. Например, раз в 250ms. И SObjectizer каждые 250ms будет отсылать на специальный mbox целую пачку сообщений с текущими значениями.

Со временем у этого механизма выявился небольшой недостаток: для ряда сценариев обработки мониторинговой информации было очень желательно знать, что очередной такт раздачи данных начался или закончился. В версии 5.5.18 этот недостаток был устранен. В пространство имен so_5::stats::messages добавлены новые сообщения distribution_started и distribution_finished. Сообщение distribution_started отсылается в начале каждого такта раздачи очередной порции мониторинговой информации. Фактически, это сообщение первое, которое отсылается stats_controller-ом в начале такта. Затем уже следуют сообщения от всех источников данных внутри SObjectizer Environment. А закрывает такт сообщение distribution_finished. Это последнее сообщение, после которого уже не будет никаких сообщений, относящихся к только что закончившемуся такту.

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

Под катом пример агента, который инициирует раздачу мониторинговой информации три раза в секунду, после чего обрабатывает только сообщения с данными о длине очередей заявок на рабочих нитях запущенных в SObjectizer Environment диспетчеров (для фильтрации нужных сообщений используется механизм delivery filters).

пятница, 2 сентября 2016 г.

[prog.c++] Нововведения в SObjectizer-5.5.18: явный запрет на вложенные смены состояния агента

После того, как в SObjectizer были добавлены обработчики входа/выхода в/из состояния агента появилась возможность совершить ошибку: в on_enter/on_exit разработчик может инициировать переход в другое состояние. Что-то вроде:

class demo : public so_5::agent_t {
  state_t st_one{ this };
  state_t st_two{ this };
  ...
  virtual void so_define_agent() override {
    st_one.on_enter( [this]{ st_two.activate(); } );
    ...
  }
};

Такое поведение ошибочно и может приводить к серьезным проблемам:

четверг, 1 сентября 2016 г.

[prog.c++] Нововведения в SO-5.5.18: глобальные lock_factories

Очереди сообщений в диспетчерах SObjectizer-а используют объекты синхронизации для защиты содержимого очереди при работе с ней из нескольких нитей. Объекты синхронизации создаются посредством специальных фабрик (т.н. lock_factory). Разработчик может указать, какая именно lock_factory должна быть использована при создании конкретного диспетчера.

Эта функциональность появилась в версиях 5.5.10 и 5.5.11. Тогда же были реализованы два типа lock_factories:

[prog.c++] Анонс будущих постов об изменениях в SObjectizer-5.5.18

Добавление новых фич в свой программный проект -- это как ремонт: нельзя закончить, можно прекратить :) Вот и работы над очередной версией SObjectizer-а с номером 5.5.18 оказываются в похожей ситуации. Нужно просто ставить жесткую отсечку по времени и включать в релиз только то, что будет готово к этой отсечке.

Но в этот раз для меня ситуация серьезно сложнее, чем в недавнем прошлом. Другие проекты, дела и заботы оставляют для SO-5 меньше времени и сил. Поэтому возникают проблемы с описанием нововведений на английском языке в Wiki проекта. Опыт говорит, что описание новой фичи на английском требует где-то раза в три больше времени, чем такое же описание на русском. Как минимум раза в три. Сейчас такого запаса у меня нет. Поэтому сделаю описание того, что добавляется в 5.5.18, в виде нескольких постов на русском языке в блоге.

Надеюсь, мои коллеги и просто волонтеры, которым будет интересно помочь проекту, со временем сделают перевод на английский язык. Тогда Wiki будет пополнена, после чего и состоится официальный релиз.

среда, 31 августа 2016 г.

[life.cinema] Очередной кинообзор (2016/08)

Подошло время очередного кинообзора. Как заведено, в начале списка те фильмы, который понравились мне больше всего и далее по убыванию положительных впечатлений.

Сто лет прощения (Cien años de perdón, 2016). Незамысловатая европейская криминальная картина. Но для меня пошла просто как бальзам на душу. В кои-то веки что-то вменяемое, где сюжет стоит намного впереди знаменитых актеров и спецэффектов.

Кровный отец (Blood Father, 2016). Очень приятно было вновь увидеть Мэла Гибсона в главных ролях. Только сюжет фильма произвел неоднозначные впечатления. Нет уверенности, что удалось разобраться в причинах происходящего и мотивации некоторых героев.

Репортерша (Whiskey Tango Foxtrot, 2016). Не шедевр, но есть в нем что-то сентиментально-хорошее, что оставило приятные впечатления.

Финансовый монстр (Money Monster, 2016). Ну ничо так. Можно посмотреть.

Дуэль (The Duel, 2015). Неспешный вестерн, построенный вокруг двух главных актеров. Если нравятся злодеии в исполении Вуди Харрельсона, то пропускать сей фильм не стоит.

Крутые меры (Bastille Day, 2016). Скорее разочаровал, чем порадовал. После трейлера ждал большего.

Конец дня (Daylight's End, 2016). Кому нравятся постапокалиптические фильмы про шустрых зомби на этот фильм можно обратить внимание.

Вирус (Viral, 2016). Любители жанра вполне могут посмотреть. Не самый плохой образчик.

Иллюзия обмана 2 (Now You See Me 2, 2016). По ходу просмотра возникает всего один вопрос: что за херню нам показывают? А после просмотра остается другой вопрос: нафига я потратил время на эту херню?