LINUX.ORG.RU

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

 , , ,


0

2

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

Проект живет на SourceForge, распространяется под трехпунктной BSD-лицензией.

Версию 5.5.4 можно взять либо из секции Files на SF, либо из Svn-репозитория.

Если говорить кратко, то в версии 5.5.4 появилось следующее:

  • вспомогательные шаблонные методы make_agent и make_agent_with_binder (аналоги make_shared и make_unique из C++11/14), упрощающие создание экземпляров агентов;
  • приватные диспетчеры. Приватный диспетчер можно использовать только по прямой ссылке, которую получает только тот, кто создает такой диспетчер. Так же приватные диспетчеры автоматически уничтожаются, когда ими больше никто не пользуется;
  • лимиты для сообщений, т.е. возможность ограничить количество сообщений конкретного типа в очереди заявок для агента, что позволяет реализовывать простую защиту агентов от перегрузок штатными средствами SObjectizer-а;
  • новый тип context_t и дополнительный конструктор для базового типа agent_t, за счет чего упрощается создание агентов, использующих лимиты для сообщений, особенно при наследовании;
  • простейший вариант сбора и распространения мониторинговой информации о том, что происходит внутри SObjectizer Run-Time. В первую очередь этот вариант предназначен для предоставления возможности сохранения мониторинговой информации посредством таких инструментов, как statsd+graphite, Zabbix, Nagios и т.д.;
  • несколько новых примеров.

Если интересны подробности, то сюда.

Отдельная благодарность Алексею Сырникову, как за помощь в подготовке этого релиза, так и за работы по созданию зеркала SObjectizer на GitHub-е.

★★★★★

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

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

Неймспейсы хороши тем, что с ними можно очень гибко работать. Если не нравится писать so_5::rt::agent_t, запросто можно сделать using namespace so_5::rt или namespace so5=so_5::rt;

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

Еще бы вики от самых основ

Э... А можно расшифровать? Нужна Wiki, где все бы описывалось от самых базовых вещей?

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

особенно в хидерах с темплейтами. очень удобно.

И что предлагается?

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

не нужно же, ну :)

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

Не только и не столько :)

Предоставление рабочих контекстов агентам выполняют диспетчеры. SO5 предоставляет пять типов готовых диспетчеров:

  • one_thread — все агенты, привязанные к этому диспетчеру работают на одной общей нити;
  • active_obj — каждому агенту выделяется его собственная нить, больше никто не может работать на этой нити;
  • active_group — каждой группе агентов выделяется своя рабочая нить, только агенты этой группы работают на ней;
  • thread_pool — все привязанные к диспетчеру агенты работают на пуле нитей фиксированного размера;
  • adv_thread_pool — все привязанные к диспетчеру агенты работают на пуле нитей фиксированного размера, при этом агент может работать сразу на нескольких нитях из пула.

При этом в приложении может быть несколько экземпляров диспетчеров разного типа. Допустим, пять штук диспетчеров one_thread, три штуки active_group, пятнадцать штук thread_pool и т.д.

Вообще, есть две презентации, которые быстро погружают в SObjectizer: http://eao197.blogspot.com/2015/02/progc11-sobjectizer-55.html (на русском) и http://eao197.blogspot.com/2015/02/prog-two-introductory-presentations.html (на английском, тут чуть меньше «воды»).

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

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

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

Ну так покажите, как должно выглядеть не унылое, но функциональное, да еще и кроссплатформенное.

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

в котором чтобы написать хелло ворлд надо намандякать несколько десятков строк бойлерплейт кода

Ну вот на счет десятков строк бойлерплейт кода. Минимальный hello_world, в котором создается дополнительная рабочая нить, печатающая thread_id и приветствие, на чистом C++11 выглядит так:

#include <iostream>
#include <thread>

int main()
{
	using namespace std;

	cout << this_thread::get_id() << ": Hello!" << endl;

	thread t{ []{
		cout << this_thread::get_id() << ": Hello2!" << std::endl; }
	};
	t.join();
}

Тоже самое на SO5 вот так:

#include <iostream>
#include <so_5/all.hpp>

int main()
{
	using namespace std;

	cout << this_thread::get_id() << ": Hello!" << endl;

	so_5::launch( []( so_5::rt::environment_t & env ) {
		auto coop = env.create_coop( so_5::autoname );
		coop->define_agent().on_start( [&env]() {
			cout << this_thread::get_id() << ": Hello2!" << endl;
			env.stop();
		} );
		env.register_coop( move( coop ) );
	} );
}

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

eao197 ★★★★★
() автор топика
Ответ на: комментарий от eao197
#include <iostream>
#include <cspcpp/all.hpp> // нормальное, вменяемое название, а не so_5, но это дело вкуса

int main()
{
	using namespace std;

	cout << this_thread::get_id() << ": Hello!" << endl;

	csp_id = cspcpp::launch( []() {
			cout << this_thread::get_id() << ": Hello2!" << endl;
	} );
        // или
        csp_id2 = cspcpp::launch( cspcpp::pool(), std::bind(&myclass::myfunc, myclas_instance_ptr ) );

        // или
        csp_id3 = cspcpp::launch( get_place(csp_id2), []() {
			cout << this_thread::get_id() << ": Hello2!" << endl;            
        }
}

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

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

Отлично!

csp_id = cspcpp::launch( []() {
	cout << this_thread::get_id() << ": Hello2!" << endl;
} );
А вот здесь что запускается? Новая нить, новая короутина? Как этот csp будет получать какие-нибудь сообщения извне?

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

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

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

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

неймспейсы

А что с ними не так? нужно как в Qt чтоль? чтоб их ваще не было и везде писать эти префиксы типа Q/Qt?

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

При чем здесь Erlang?

Кому нужно использовать Erlang, тот просто использует Erlang.

Задача SO5 дать возможность работать с агентами в C++ном коде.

Можно обсуждать, зачем агенты в C++, но это будет уже совсем другое обсуждение. Здесь же хотелось бы остаться в рамках предположения, что агенты в C++ных программах могут быть нужны. И вопрос в том, как это сделать наилучшим (или одним из менее болезненных) способов.

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

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

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

надо намандякать несколько десятков строк бойлерплейт кода

Проблема излишней многословности SObjectizer известна. Вот, например, совсем свежее.

Борьбе с ней уделяется серьезное внимание. И прогресс таки есть. Например, появилась возможность определять события агентов в виде лямбда-функций. Затем появились ad-hoc агенты, для которых не нужно определять отдельных C++классов. Появились автоматически создаваемые для агентов direct-mbox-ы. Появился режим autoshutdown для автоматического останова SO Run-Time. Появилась фича autoname, чтобы не нужно было придумывать имена кооперациям. Появились функции send, send_to_agent, send_delayed и т.д., что упростило и сократило код по отсылке сообщений. Появились приватные диспетчеры и make_agent. Все это позволяет писать все меньше и меньше кода.

Т.е. процесс идет. Другое дело, что быстро он идти не может по вполне понятным причинам:

  • революционные идеи, которые в корне что-то меняют, появляются не так уж и часто. Вот до тех же ad-hoc-агентов додумались не сразу, а когда додумались, то оказалось, что это очень круто, в каких-то частных случаях. Все остальное развивается эволюционно. Пишешь-пишешь код, замечаешь, что где-то что-то надоедает, проходит какое-то время и решение созревает. Но на это нужно время. Ну или конструктивные предложения со стороны. Которых, нужно сказать, гораздо меньше, чем высказываний «говно» без какой-либо попытки объяснить, что именно не нравится и как могло бы нравится;

  • приходится считаться с возможностями компиляторов, с которыми нужно иметь дело. А это ограничивает то, что можно сделать. Скажем, еще в начале 2014-го приходилось заботится о поддержке MSVS2012, в котором не было variadic templates. И это сильно сдерживало. Когда от его поддержки отказались и оставили только MSVS2013, ситуация сразу резко улучшилась. Но и теперь тот же MSVS2013 является нехилой гирей на ногах, т.к. если бы сосредоточится только на GCC и clang, можно было бы писать еще более лаконичный код;

  • нельзя круто ломать совместимость между версиями. Поскольку SO5 каждый день используется в разработке реальных проектов и создавать проблемы людям, которые это делают, кардинально ператрахивая API и принципы работы — это не есть хорошо.

Так что дело далеко не только в моих собственных желаниях или возможностях.

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

человечий интерфейс для самых очевидных и распространённых задач

А вот, кстати, какие задачи являются «самыми очевидными» и «самыми распространенными»?

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

в том-то и дело, что никакие. потому и ненужно.

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

Здесь же хотелось бы остаться в рамках предположения, что агенты в C++ных программах могут быть нужны.

Не могут.

И вопрос в том, как это сделать наилучшим (или одним из менее болезненных) способов.

А зачем это вообще делать болезненым способом?

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

Не могут.

Какие ваши доказательства?

А зачем это вообще делать болезненым способом?

Ну тут у многих попаболь при виде плюсового кода. Может получится как-то облегчить их страдания.

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

Какие ваши доказательства?

кокаином.

Ну тут у многих попаболь

при виде православного эрланга. А ты о чём?

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

А ты о чём?

Да я то о том, что сделано и чем можно пользоваться.

А вы, очевидно, просто позвиздеть зашли. Ну так шли бы себе дальше.

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

О, видишь, у тебя уже тоже печёт)

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

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

Забань анонимуса

Вам сложно поверить, но бывают анонимусы и не мудаки.

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

Как я посмотрю ты даже в целой теме своим говном насрал.

А вот, кстати, какие задачи являются «самыми очевидными» и «самыми распространенными»?

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

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

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

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

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

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

Online-обработка платежных транзакций подойдет?

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

Лол, щаз Царь обругает оное за типа вебню.

Там из вебни было разве что использование HTTPS для обращения к биллингам опсосов.

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

вряд ли. потому что значительно больше 99% людей решают эти задачи без всяких акторов.

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

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

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

твоя маниакальная склонность считать всех несогласных идиотами умиляет

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

Господин Царь, потрудитесь разобраться, кто у кого и что спрашивает.

В отличии от тебя я знаю и читаю контексты и не несу херню.

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

Online-обработка платежных транзакций подойдет?

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

Давай, придумай задачу. Я даже попробую тебя исцелить.

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

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

Мы посмотрим сможешь ли ты хоть что-то противопоставить голой сишке от Царя.

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

многопоточные приложения

Зачем в твоей примитивной обработки транзакций, где трупут даже 10% ведра 2-го пенька не загрузит нужна «многопоточность»?

Опиши какая-нибудь простую здачу, которая эмулирует твои транзакции. Мне всегда было интересно почему у вас там какие-то проблемы и какая-то «многопоточность», которая нахрен не упала на обработке 20мегабайт/с

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

Понимаешь в чем штука - ты должен

Должен? Вы, заблуждаетесь сударь. Ни вам, ни кому либо еще здесь я ничего не должен.

Есть инструмент, он вот такой, лежит вот там, документация вот там.

Хотите — пользуйтесь. Не хотите — не пользуйтесь. Что-то не нравится, скажите что именно, почему и как вы хотели бы видеть исправления.

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

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

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

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

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

Зачем в твоей примитивной обработки транзакций, где трупут даже 10% ведра 2-го пенька не загрузит нужна «многопоточность»?

Поржал.

Сударь, если вам нечего сказать, не пошли бы вы, например, с кем-нибудь про Rust или Go общаться?

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

Поржал.

Собственно я и не сомневался, что тебе ещё сказать, только ко-ко-ко.

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

Сударь, если вам нечего сказать, не пошли бы вы, например, с кем-нибудь про Rust или Go общаться?

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

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

Сказать какраз-таки нечего тебе.

Все что я хотел сказать, воплощено в коде и опубликовано в виде версии, анонс которой здесь и обсуждается. Что-то не нравится? Извольте объяснить в конструктивном русле. Не можете — идете лесом.

Если вам настолько хочется продемонстрировать миру свою крутизну, не вопрос: вот здесь лежит куча примеров (часть из них описана в Wiki). Берете и реализуете любой из них по-своему.

Ты так и не осилил привести прифец нужности вектора - я уж не говорю о твоей поделке.

Доказывать Царями необходимость std::vector — до такой степени маразма я еще не дошел.

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