LINUX.ORG.RU

Обновился инструмент для работы с агентами в C++: SObjectizer 5.5.15

 , , ,


0

2

SObjectizer — это небольшой фреймворк для упрощения разработки многопоточных приложений на C++11 за счет использования идей из моделей акторов и publish-subscribe. SObjectizer является OpenSource-проектом и распространяется под трехпунктной BSD-лицензией.

Этот релиз добавляет возможность создания агентов в виде иерархических конечных автоматов. В версии 5.5.15 поддерживаются такие вещи, как композитные состояния, shallow- и deep-история, обработчики входа/выхода, лимиты времени, передача события на обработку в другое состояние (что-то вроде defer) и подавление событий.

Малюсенький примерчик для демонстрации новых возможностей: агент, который реализует мигающий LED-индикатор. Этот агент обрабатывает сигнал turn_on_off для включения и выключения режима мигания. Когда режим мигания включен, агент зажигает LED-индикатор на 1.5 секунды, затем тушит его на 0.75 секунды, затем опять зажигает и опять тушит и так до тех пор, пока не получит следующий сигнал turn_on_off.

Код этого агента может выглядеть вот так:

class blinking_led final : public so_5::agent_t
{
	state_t off{ this },
		blinking{ this },
		blink_on{ initial_substate_of{ blinking } },
		blink_off{ substate_of{ blinking } };

public :
	struct turn_on_off : public so_5::signal_t {};

	blinking_led( context_t ctx ) : so_5::agent_t{ ctx }
	{
		this >>= off;

		off.just_switch_to< turn_on_off >( blinking );

		blinking.just_switch_to< turn_on_off >( off );

		blink_on
			.on_enter( []{ /* some device-specific code */ } )
			.on_exit( []{ /* some device-specific code */ } )
			.time_limit( std::chrono::milliseconds{1500}, blink_off );

		blink_off
			.time_limit( std::chrono::milliseconds{750}, blink_on );
	}
};

Взять версию 5.5.15 можно либо из раздела Files на SouceForge, либо из Svn репозитория, либо из зеркала на GitHub.

★★★★★

Последнее исправление: eao197 (всего исправлений: 1)

Ответ на: комментарий от eao197

Чорт! Когда-нибудь я обязательно возьму и попробую. У меня даже руки не дошли на нем переделать то, что задумал. Все оказалось проще решить списком узлов и количеством заданий в них....

anonymous
()
Ответ на: комментарий от eao197

пример

В завершении процесса в два шага есть потенциальный баг. В send_sigkill не проверяется, что это тот же процесс, а не созданный заново. Возможна ситуация, когда процесс завершился от SIGINT, стартовал какой-то новый процесс, которому был назначен тот же pid, и send_sigkill шлёт SIGKILL ничего не подозревающей программе.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Этот пример демонстрирует возможность отмены отложенного сообщения. Если бы в него еще была добавлена специальная обработка ситуации, запрещающей до поры до времени делать wait на дочернем процессе, то объем бы увеличился, а наглядность снизилась.

Там еще и обработки исключений в рабочих потоках нет. Так что если procxx::process::exec() бросит исключение, то вся программулина навернется медным тазом.

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197

Но в реальной программе-то придётся это обрабатывать. Иначе, когда такое накопится, получится код, который работает только при правильной фазе луны.

Хоть бы комментарий написал, что ли.

Я не знаю, зачем я тебе вообще об этом написал. Меня прям передёргивает, когда я вспомню, сколько в софте, которым я пользуюсь, моментов «а тут мы у потока приоритет повыше ставим, и он успевает прочитать данные со стека второго потока, до того, как там деструктор отработает». И это только тех, что я видел.

Считаю, что публиковать примеры с известными, но не упомянутыми дефектами, это сознательная диверсия. Хотя, конечно, решаешь в итоге ты, а не люди с форума.

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)
Ответ на: комментарий от i-rinat

В реальной программе много чего приходится обрабатывать. И в реальном коде доля строк, относящихся непосредственно к особенностям работы SO-5, очень быстро сокращается до единиц, а то и до долей процентов. Вот, один из примеров оного.

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

PS. Комментарий добавил.

eao197 ★★★★★
() автор топика

Думаю над тем, чтобы увеличить объем доступной мониторинговой информации в SObjectizer и реализовать учет времени, потребляемого event-handler-ами. Пока мысли вот такие: http://eao197.blogspot.com/2016/06/progthoughts-run-time-sobjectizer-event.html Если есть какие-то соображения или опыт собора/обработки подобных данных, то будет интересно послушать.

eao197 ★★★★★
() автор топика

Выкатили релиз версии 5.5.17.

Основная фича — это возможность сборки SO-5 в виде статической библиотеки. Плюс несколько мелких улучшений в работе с mchain-ами:

Расширение возможностей по run-time мониторингу решили отложить до версии 5.5.18, т.к. для их реализации потребуется больше времени, чем предполагалось.

Взять версию 5.5.17 можно либо из раздела Files на SouceForge, либо из Svn репозитория, либо из зеркала на GitHub.

eao197 ★★★★★
() автор топика
29 сентября 2016 г.
Ответ на: комментарий от eao197

Выкатили релиз версии 5.5.18

Основные изменения касаются системы рантайм-мониторинга потрохов SObjectizer. Появилась возможность отслеживать активности рабочих нитей (сколько событий было обработано, сколько времени на это было потрачено, сколько времени ушло на ожидание событий). Новые сообщения distribution_started и distribution_finished для упрощения обработки мониторинговой информации. Возможность задавать глобальные lock_factories. Плюс более жесткий контроль за поведением SObjectizer-а в некоторых крайних случаях (попытки сделать вложенный вызов so_change_state, попытка доставки отложенных/периодических сообщений в mchain-ы, который могут быть переполненными). Более подробно все это описано в Wiki проекта.

Отдельная благодарность Андрею Углику за помощь в подготовке релиза.

Взять версию 5.5.18 можно либо из раздела Files на SouceForge, либо из Svn репозитория, либо из зеркала на GitHub.

Так же за последнее время появилась серия статей с рассказом о SObjectizer: SObjectizer: что это, для чего это и почему это выглядит именно так?, От простого к сложному Часть I, Часть II, Часть III, Акторы в виде конечных автоматов — это плохо или хорошо?, Проблема перегрузки агентов и средства борьбы с ней.

eao197 ★★★★★
() автор топика

С конференции CoreHard C++ Autumn 2016

Если кому-то интересно, то вот слайды доклада «Модель Акторов и С++: что, зачем и как?» в прошедшей вчера в Минске конференции CoreHard C++ Autumn 2016. В докладе речь идет не только, и не столько про SObjectizer, сколько про достоинства Модели Акторов, современные популярные инструменты с ее реализацией, в том числе и про несколько готовых инструментов для C++ (QP/C++, Just::Thread Pro, CAF, SObjectizer).

eao197 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.