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

Ну дак ответь, мне правда интересно. Я вот сидел-голову ломал и ничего так и не смог придумать. Ты в прошлый раз так и не смог ответить так же.

Я почти уверен, что ты сам не знаешь зачем оно надо, ибо это невозможно придумать для неё применение.

Все примеры без полезной работы - зачем они нужны, если они ничего не дают?

.on_enter( []{ /* some device-specific code */ } )//это где будет выполнено? В отдельном треде? Тогда твои акторы встанут раком. В этом? Так же станут раком.
//как это вообще может работать? Это просто не может работать предсказуемо.
//этож мало того, что задачу придумать для этих "сообщений" сложно, а уж когда они обрабатываются хрен пойми когда - это же просто невозможно.
			.on_exit( []{ /* some device-specific code */ } )

Зачем посылать кому-то «сообщение» чтобы он что-то сделал, либо стопнул, если проще это сделать, либо стопнуть. Не?

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

Я вот сидел-голову ломал и ничего так и не смог придумать.

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

Все примеры без полезной работы - зачем они нужны, если они ничего не дают?

Не следует говорить за всех.

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

Киянка не виновата, что вы не представляете, как ей забивать гвозди

Я вот тоже не представляю, как киянкой забивать гвозди. А, главное, зачем.

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

Я вот тоже не представляю, как киянкой забивать гвозди. А, главное, зачем.

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

Так же и царь: он смотрит на SO-5 с позиций того опыта, который у него есть и не знает, зачем ему нужен фреймворк с поддержкой модели акторов. Но это вовсе не проблема модели акторов или фреймворка. Просто у человека другие задачи.

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

Вот именно. Если вы смотрите на киянку и думаете, что ей неудобно забивать гвозди

Дак ты скажи для чего она нужна? Это ведь так просто - ты ей работаешь? Скажи как. Всё просто.

Так же и царь: он смотрит на SO-5 с позиций того опыта, который у него есть и не знает, зачем ему нужен фреймворк с поддержкой модели акторов. Но это вовсе не проблема модели акторов или фреймворка. Просто у человека другие задачи.

Дак ты скажи - зачем. Ты же понимаешь - скажи. Для решения каких задач нужен твой инструмент?

Вот я могу назвать применение киянки и поймёт любой, кто даже её не юзал и долбил молотком через что-то/доской/рукой - она нужно, у неё есть применение. Ибо задача есть не зависимо от инструмента, даже если инструмента нет - задача есть.

Так же и тут. Какая задача? Для чего? Не ведомо.

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

Не следует говорить за всех.

А где я говорю за всех? Я говорю то, что я вижу. А ты сказать своё видение не можешь, либо не хочешь, не?

Насколько я понимаю - пример должен показывать реализацию подхода, который встречается в решениях задач. Это типа упрощённая мини-задачка.

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

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

Дак ты скажи для чего она нужна?

Уже много раз было сказано: для упрощения разработки многопоточного софта на C++. Чем сложнее софт, тем выгоднее использование инструментов вроде SObjectizer, C++ Actor Framework, Just::Thread Pro или Intel TBB.

А уже что это за софт, тут уж пространство широкое: системы имитационного моделирования, сложные тестовые стенды, платежные шлюзы, почтовые сервера, MQ-шные сервера, системы сбора и обработки данных (ИИС), системы управления (АСУТП) и т.д. и т.п.

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

Уже много раз было сказано: для упрощения разработки многопоточного софта на C++

Т.е. ничего он не решеает.

Понимаешь - есть многопоточный софт - хорошо. Мы его пишем и у нас возникают какие-то проблемы. Хорошо, какие?

Далее, они у нас возникли и как твоя куллиба помогает их решать?

Ладно - там с «пространство» конечно я посмеялся, ну ладно:

почтовые сервера

Давай возмём это. Вот у меня есть почтовый сервер - опиши мне модель сервкера на твоих акторах. Я её не вижу. Я могу тебе описать модель сервера на уровне и средставами с которыми работаю я.

Что такое мейл-сервер. Пришло-сохранили-отдали. Где тут конкретно твоя модель применима?

В целом как всегда - заявления есть, а ничего конкретного нет. Эти заявления не стоят ничего. «для упрощения разработки многопоточного софта на C++» - это можно приписать к чему угодно, а «Чем сложнее софт, тем выгоднее использование инструментов врод» - этим можно только подтереться, а если предположить, что мы идиоты, то просто приписать к чему угодно.

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

Т.е. ничего он не решеает.

Ok. Вам виднее.

В целом как всегда - заявления есть, а ничего конкретного нет. Эти заявления не стоят ничего. «для упрощения разработки многопоточного софта на C++» - это можно приписать к чему угодно

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

Нужен кому-то подобный инструмент — берет и использует. Не нужен — не берет, не использует.

Компостировать мне здесь мозг своим непониманием «зачем нужны акторы» — это значит занимать время, которое могло быть потрачено на что-либо более полезное.

Итого: вы чего-то не понимаете, не знаете зачем нужно, не представляете где применить — проходите мимо.

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

Т.е. ты сам не знаешь зачем они нужны. Типичная ситуация.

у меня нет задачи продать что-либо кому-либо.

Нет, ты опять пытаешься съезжать - уже давно пора понять, что со мною такая тема не работает.

Ты должен описать их применение не потому, что ты впариваешь их или нет - ты начал спорить, намекая на то, что они нужны. Значит ты либо показываешь, либо не показываешь. Если ты не показываешь - ты балабол.

Я не вижу, а ты видишь, но объяснить не можешь, но при этом со мною споришь. Поверить в то, что ты реально можешь придумать для них не притянутые за уши примнение - это с трудом.

это значит занимать время, которое могло быть потрачено на что-либо более полезное.

Зачем нужны акторы - это времени занимает столько же, сколько срать на форуме. Эта отмазка настолько убогая и настолько не рабочая - ты из джунглей сбежал что-ли? В этом мире это не работает и в этом даже школьники не верят.

Итого: вы чего-то не понимаете, не знаете зачем нужно, не представляете где применить — проходите мимо.

Итого - не можешь ответить - не спорить. Я скзаал «Не нужно» - значит не нужно. Ты попытался мне возразить - не смог. Итог - не нужно. Ты ничего не понял - ты только доказал мою правоту. Всё просто.

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

Зачем посылать кому-то «сообщение» чтобы он что-то сделал, либо стопнул, если проще это сделать, либо стопнуть. Не?

Это имеет смысл в многопоточном приложении. Когда разные агенты работают на разных потоках, например, из соображений производительности, чтобы использовать все ресурсы CPU. В таком варианте использования у тебя нет гарантии, что пока ты в этом потоке что-то останавливаешь, в другом агент не будет проводить другие операции с этим чем-то. Поэтому каждый агент работает только на одном потоке (возможно сейчас на одном, а чуть позднее на другом, но в один момент времени только на одном и, поэтому код агента полностью однопоточный) (есть одно исключение, когда явно помеченный агент может одновременно работать на разных потоках одновременно), другой агент в это время может работать на другом потоке. Таким образом вся многопоточность находится в работе с очередями сообщений, но это код библиотеки, а не приложения.

Насколько я понимаю, архитектура с агентами появилась, чтобы упростить разработку сложных многопоточных приложений, когда архитектура с простыми блокировками становится слишком сложной. Попробуй продумать логику блокировок, когда у тебя не приложение типа производитель-потребитель с одной очередью, а таких очередей, которые нужно блокировать штуки 3, для разных операций нужно блокировать какой-то набор очередей, возможно, заранее неизвестно какой, либо даже все одновременно. Ты довольно быстро поймешь, что либо там будет глобальная блокировка, либо при очередном изменении функционала ты что-нибудь не учтешь и у тебя возникнут либо гонки, либо дедлоки, либо, если совсем не попрет, лайвлоки. Вот можешь просветиться насчет разных моделей конкурентного/параллельного программирования http://it-ebooks.info/book/3758/.

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

Вменяемый аноним на LOR-е! Спасиб, тебе, добрый человек!

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

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

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

Ахренеть, а пацаны-то не знали, что в 21веке есть потоки.

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

Чё?

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

Чё?

Ты понимаешь, что когда твой недоагент работает, то он не может отвечать, а если он отвечает, то как? Значит он либо будет стопать, либо ждать завершения, но я тебя удивлю - это обычный worker-pool.

Таким образом вся многопоточность находится в работе с очередями сообщений, но это код библиотеки, а не приложения.

У меня такое ощущение, что ты нихрена не понимаешь в том, о чём говоришь.

Я там выше спрашивал про мейл-сервер. Опиши его работу на своим «агентах», опиши работу чего-либо на своих агентах, если не осилиться с этим.

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

Меня не интересует этот маркетинговый булшит. Такую херню толкают ламеркам за партами, либо при попытке впарить.

Ты мне конкретно - «вот есть такая-то задча - а там локи, но мы взяли наши „агенты“ и вуаля - у нас локов нет», при этом их быть не должно, а не они скрыты в либе. С таким же успехом я могу взять готовые реализации какого угодно подхода, да просто многопоточные структуры данных.

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

Перед тем, как толкать мне херню - придумать эту логику должен ты. Я конкретно спросил - назови задачи в которых эта логика есть, причём не абстрактно, а конкретно.

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

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

Я могу просто на каждую твою «нужно блокировать» могу сказать «не нужно блокировать» и ты обделаешься. Тут же и убежишь плакаться мамке. Зачем ты мне пишешь эту херню?

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

Вменяемый аноним на LOR-е! Спасиб, тебе, добрый человек!

Этот аноним - убогая жертва пропаганды, которая обделается на первом же сообщении.

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

Ога, смешно. Ну выкати мне любую херню на своей недолибе - я обоссу её руками на одном потоке. Естественно херню, кторую можно проверить.

Давай, возможно ты сможешь подумать. Вот смотри - ты сейчас сказал, что не надо ручных операций и освобождении памяти. Я тебя удивлю, но их не надо ни в одной из реализаций любого многопоточного фреймворка, с любой моделью - абсолютно. Вон ты кукарекал про tbb - нету никаких локовруками - просто паралельные структуры и алгоритмы.

И теперь внимание вопрос - чем твоя модель лучше другой? А я тебе отвечу - не лучше - она дерьмо бесполезно, а как дело доходит до «зачем нужна» любая ламерюжка пытается прятаться за понянием «фреймворк для паралельного праграммирования», приписывая себе все его плюсы, при этом эти плюсы есть у любого и не стоят ничего.

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

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

Т.е. я писал без либы - у меня бы не было никаких «выделенной под очереди и сообщения», а тут я взял либу - они у меня полявились и достижение либы в том, чтобы за своим дерьмом следить самой.

Это просто топчик.

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

Ну выкати мне любую херню на своей недолибе - я обоссу её руками на одном потоке.

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

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

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

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

Давай ради интереса знаешь что сделаем? Возьмём 400твоих куллагентов и сунем им какую-то работу, а после измерим время, за которые они все 400отработают и сравним поделим на время задачи. Пошля им всем сигнал «делать».

Я тебе могу гарантировать, что мы получим х10 от времени чистой работы. Сделай пж.

Сделай мне 400 агентов и оповещалку им - я сделаю всё остальное. Ну чтоб ты мне не кукарекал, что я как-то неправильно заюзал твою куллибу, а когда я получу х10 - ты будешь мне говорить «ты всё нетак сделал», а когда я тебя спрошу «покажи как» - будешь так же кукарекать «мне некогда, время не ждёт»

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