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)

this >>= off;

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

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

Это всего лишь один из вариантов. Если насколько короткий не нравится, то можно записать так so_change_state(off) или так off.activate(). Разным людям нравится разное.

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

Я же и написал, что плюсы для этого, к счастью, не подходят. Но некоторые всё равно пытаются.

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

А можно мне увидеть какую-то пример задачи, которую можно решить с помощью этой чудо-либо?

Я вот опять думал, думал, думал и ничего не придумал - это невозможно придумать задачу для это кулл"модели".

Посмотрел я снова твои примеры - они все бессмысленны и не отражают ни одной реальной задачи, да и просто не имеют смысла. Что отражает из реального мира твой пример с лампочкой?

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

кулл"модели"

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

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

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

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

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

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

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

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

Может ты ответишь на мои вопросы? Пацан так усиленно свою портянку пастит - 100% должен же уже хоть кто-то понять зачем оно надо?

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

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

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

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

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

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

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

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

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

должен же уже хоть кто-то понять зачем оно надо?

Почитай предыдущие его темы. Мне кажется никто так и не понял.

anonymous
()
Ответ на: комментарий от 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 ★★★★★
() автор топика
Ответ на: комментарий от CyberK

Там видео на час :( Может как-то можно акцент определить?

Пример с лампочкой был приведен потому, что он a) крайне тривиальный, но при этом b) умудряется показать значительную часть новых возможностей и c) очень короткий, причем d) написан без излишнего использования возможностей C++11, посему должен более менее нормально восприниматься теми, кто нежно любит «C with Classes».

Это вовсе не пример задач, которые предполагается решать с помощью иерархических КА. Для мира embedded текущий SO-5 не приспособлен.

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

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

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

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

Чё?

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

Чё?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Давай я тебе понятным языком поясню:

Приходит балабол и говорит «стали доступны новые ашоты» - ок, хорошо. Я спрашиваю балабола, - а нахрена твои ашоты нужны? - они нужны для больших проектов, когда вы сами не можете и они делают за вас. - А какие конкретно задачи? Можно узнать? - ну все задачи, которые все - я не знаю какие, но все. - Хорошо, но у меня есть васи/пети, которые так же за меня всё могут делать - почему именно ваши ашоты? Непривычные, убогие - зачем? - наши ашоты обосрут вам всю хату, а потом уберут - они хорошие ашоты. - Но постой, разве это не твои ашоты обосрали мне хату и без них у меня бы итак не было говна - т.е. они просто убрали за собою? Ну дак это не плюс - это отсутствие минуса, причём который есть у всех холопов на рынке.

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

Зачем нужны ашоты и чем они лучше абстрактных васей/петей? Не ясно.

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

О боже, посмотрел я это убожество.

С каким пор кастить можно в volatile - это не работает - раз.

Какой жопой эта амёба вывела, что в первом(на макросах) примери и втором(на наследовании) есть какая-то разница? Какие нахрен ещё виртуальные функции - они равнозначны.

Самому не смешно эту ламерюгу недобитую слушать? Всем надо было встать и нассать ему на рожу уже за один каст.

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

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

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

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

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

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

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

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

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

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

anonymous
()

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

Тем не менее, т.к. вопросы предназначения SO-5 и производительности SO-5 задают не только анонимные LOR-овские психи, имеет смысл чуток раскрыть эту тему.

Во-первых, есть concurrent programming, а есть parallel programming. Первое — это «одновременное» выполнение кучи практически независимых активностей приложения. Вовсе не обязательно одновременное в смысле «работающее параллельно». Второе — это использование возможностей компьютера по распараллеливанию вычислений для сокращения времени решения вычислительной задачи. Т.е. обязательное использование распараллеливания для выполнения, возможно, всего одной единственной задачи.

Так вот SObjectizer — это инструмент для concurrent programming. Он нужен для того, чтобы дать возможность программисту оформить кучу мелких или не очень активностей, существующих в приложении, в виде независимо работающих агентов. С задействованием многопоточности для обеспечения параллельного выполнения кода агентов на разных нитях. И снятию с разработчика забот о синхронизации между параллельно работающими агентами за счет организации асинхронного обмена сообщениями между ними.

Соответственно, вопрос о том, как быстро 400 агентов выполнят какую-то задачу в concurrent programming не столь важен, как вопрос о том, насколько сложно реализовать независимую и, возможно, параллельную работу этих 400 агентов.

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

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

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

Тем не менее, в универсальных фреймворках могут применяться решения, до которых не так-то просто дойти неискушенным разработчикам, которые впервые сталкиваются с некоторой задачей. Наглядный пример: std::shared_ptr. Обычный C++ программист, который никогда не писал умных указателей с подсчетом ссылок, вряд ли сможет сходу создать настолько же эффективный аналог std::shared_ptr.

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

Резюмируя: задача SO-5 — упрощение и снижение трудоемкости разработки приложений, в которых нужна конкурентность, за счет использования уже готовых инструментов. На эту тему я готов общаться, в том числе и по вопросам производительности и накладных расходов.

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

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

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

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

Так вот SObjectizer — это инструмент для concurrent programming. Он нужен для того, чтобы дать возможность программисту оформить кучу мелких или не очень активностей, существующих в приложении, в виде независимо работающих агентов.

Кстати говоря, более подробно на эту тему написано здесь: It's all about in-process message dispatching или...

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

Не думаешь сделать аналог на чистой сишке?

Так на чистой C-шке есть подобные вещи: QP/C, OOSMOS.

Ну и я сам отказался от C в пользу C++ еще в 1992-м году, как раз потому, что на C писать сложнее и квалифицированных кадров C требует поболее, чем C++.

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

Обновилась серия презентаций Dive into SObjectizer-5.5, которая выполняет плавное погружение пользователя в возможности и особенности SObjectizer-а. Теперь все части описывают самую последнюю стабильную версию — 5.5.15.

Серьезно была переработана самая первая часть, написанная почти год назад. Лишнее украшательство выброшено, примеры чуток упрощены. Имхо, получилось более-менее неплохо — основные моменты объяснены и показаны на очень простых примерах.

На данный момент в серию входит семь презентаций:

Еще парочка (про диспетчеры и mchain-ы), надеюсь, появится в ближайшие две-три недели.

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

Создана тема для сбора хотелок для следующей версии SObjectizer: Version 5.5.16 Wish List.

Предположительно, она будет выпущена в марте или в апреле 2016. Сроки выхода зависят от объема и сложности нововведений. А повлиять на этот объем/сложность можно оставив свою хотелку в обсуждении по ссылке или прямо здесь.

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

Да, большое спасибо за подсказку.

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

Производительность

Мы провели сравнение производительности SO-5.5.15 и CAF-0.14.4. Вкратце результаты такие: операции создания/удаления агентов в SO-5 медленнее, отсылка и доставка сообщений в SO-5 быстрее.

Плюс объяснение, почему в SO-5 создание/удаление агентов обходится дороже, чем в других инструментах.

eao197 ★★★★★
() автор топика
Последнее исправление: eao197 (всего исправлений: 1)
25 марта 2016 г.

SObjectizer v.5.5.16

Вышла версия 5.5.16, основные изменения в которой связаны с развитием функционала mchain-ов (аналоги Go-ных каналов):

  • реализованны функции select для чтения и обработки сообщений сразу из нескольких mchain-ов;
  • теперь mchain-ы используют MPMC-очереди сообщений, что позволяет вызывать receive и select для одного и того же mchain-а на разных нитях в параллель (в предшествующих версиях это могло привести к голоданию некоторых нитей, если receive был вызван, когда mchain был пуст);
  • добавлены вспомогательные функции create_mchain, auto_close_* и auto_join для упрощения использования mchain-ов.

Плюс еще несколько изменений, полный список которых можно найти в Wiki проекта.

Некоторые из новых возможностей показаны в следующем простом примере. Три нити генерируют случайные числа и отсылают их в исходящий mchain. Основная нить посредством select вычитывает эти числа из трех каналов. Чтение прекращается когда все нити-генераторы закроют свои исходящие mchain-ы.

#include <so_5/all.hpp>

#include <iostream>
#include <random>

using namespace std;
using namespace std::chrono;
using namespace so_5;

void uint_generator(mchain_t ch, unsigned int values, unsigned int pause)
{
	// Chain must be closed at exit.
	auto ch_closer = auto_close_retain_content(ch);

	// Random numer generation stuff.
	default_random_engine rnd_dev;
	uniform_int_distribution<unsigned int> values_rnd{0, 256};
	uniform_int_distribution<unsigned int> pauses_rnd{5, pause};

	// Generation for random numbers with random pauses between them.
	for(unsigned int i = 0; i != values; ++i)
	{
		// New random value will be sent to output chain.
		send<unsigned int>(ch, values_rnd(rnd_dev));
		this_thread::sleep_for(milliseconds{pauses_rnd(rnd_dev)});
	}
}

void demo(environment_t & env)
{
	// Thread for random number generators.
	thread first, second, third;
	// All threads must be joined at exit.
	auto thr_joiner = auto_join(first, second, third);

	// Output chains for generators.
	auto ch1 = create_mchain(env);
	auto ch2 = create_mchain(env);
	auto ch3 = create_mchain(env);

	// Generator threads can be launched.
	first = thread{uint_generator, ch1, 20, 20};
	second = thread{uint_generator, ch2, 15, 25};
	third = thread{uint_generator, ch3, 10, 30};

	// Receive numbers from generators.
	select(from_all(),
		case_(ch1, [](unsigned int i) { cout << "first: " << i << endl; }),
		case_(ch2, [](unsigned int i) { cout << "second: " << i << endl; }),
		case_(ch3, [](unsigned int i) { cout << "third: " << i << endl; }));
}

int main()
{
	so_5::wrapped_env_t sobj;
	demo(sobj.environment());
}

Версия 5.5.16 может быть загружена из раздела Files на SourceForge или же она может быть взята как из Svn-репозитория, так и с GitHub-а.

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

В приведенном коде, имхо, есть только два места, которые могут сойти за криптопослания:

this_thread::sleep_for(milliseconds{pauses_rnd(rnd_dev)});

и

select(from_all(),
	case_(ch1, [](unsigned int i) { cout << "first: " << i << endl; }),
	case_(ch2, [](unsigned int i) { cout << "second: " << i << endl; }),
	case_(ch3, [](unsigned int i) { cout << "third: " << i << endl; }));

Но первое — это чистый C++11, без какой-либо отсебятины. Второе должно быть более-менее понятно для тех, кто следит за развитием этого инструмента (если таковые есть).

Ну и если что-то выглядит слишком мудрено, то что именно?

eao197 ★★★★★
() автор топика
23 мая 2016 г.

SObjectizer v.5.5.16.1

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

Но главное не в этом. Главное в том, что минимальной необходимой для SO-5.5 версией GCC теперь является 4.8, а не 4.9, как в предыдущих версиях. И совместимость с GCC-4.8 будет поддерживаться в ближайшие три года. До окончания времени жизни Ubuntu 14.04 LTS.

Версия 5.5.16 может быть загружена из раздела Files на SourceForge или же она может быть взята как из Svn-репозитория, так и с GitHub-а.

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