LINUX.ORG.RU

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

 , , ,


4

1

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

Последние несколько лет SObjectizer развивается на SourceForge как OpenSource проект под BSD-лицензией. Подробнее об истории, текущем состоянии и направлении движения SObjectizer можно прочитать здесь.

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

Главное отличие v.5.5.0 от предыдущих версий — это отсутствие зависимости от ACE Framework. Т.е. теперь ACE в коде ядра SObjectizer не используется вообще, для SObjectizer достаточно наличия стандартной библиотеки C++11. Это означает, что SObjectizer уменьшился в размере, нужно меньше времени на сборку SObjectizer-проектов, упрощается поддержка различных компиляторов и платформ. В частности, эта версия SObjectizer тестировалась посредством MSVS2013 (Windows), GCC 4.8/4.9 (Windows, Linux), Clang 3.5.0 (Linux).

Из более мелких изменений можно отметить прямую поддержку std::chrono при работе с отложенными/периодическими сообщениями, а так же небольшое изменение названий некоторых классов/функций (с сохранением старых имен для обеспечения совместимости). Более подробная информация о нововведениях в v.5.5.0 доступна в соответствующем разделе Wiki проекта. Так же увеличилось количество страниц с описаниями базовых вещей SObjectizer.

Версия 5.5.0 может быть загружена из раздела Files или получена из Subversion-репозитория.

Примечание. Этот релиз содержит только ядро SObjectizer (т.е. проект so_5). Никакие другие подпроекты (вроде so_log или so_sysconf) в релиз не включены. Возможно, сборка SObjectizer Assembly со всеми подпроектами будет сформирована и опубликована позже (если она действительно кому-то потребуется).

PS. Анонс делается просто для того, чтобы уведомить, что такой проект есть, живет, развивается. Доступен под BSD-лицензий, т.е. даром, в том числе и для коммерческих проектов. Это не просьба сделать code review. И не попытка кому-то что-то «продать».

PPS. Специально для желающих постебаться над синтаксисом и посравнивать программирование на C++ с Perl-ом. Вот классический пример Hello, World. В традиционном, ООП-шном варианте, с созданием класса агента и переопределением виртуальных методов (хотя есть и более модерновый вариант, с использованием С++ных лямбда-функций):

#include <iostream>

// Main SObjectizer header files.
#include <so_5/all.hpp>

// Definition of an agent for SObjectizer.
class a_hello_t : public so_5::rt::agent_t
{
	public:
		a_hello_t( so_5::rt::environment_t & env )
			: so_5::rt::agent_t( env )
		{}

		// A reaction to start of work in SObjectizer.
		virtual void
		so_evt_start() override
		{
			std::cout << "Hello, world! This is SObjectizer v.5."
				<< std::endl;

			// Shutting down SObjectizer.
			so_environment().stop();
		}

		// A reaction to finish of work in SObjectizer.
		virtual void
		so_evt_finish() override
		{
			std::cout << "Bye! This was SObjectizer v.5."
				<< std::endl;
		}
};

int
main( int, char ** )
{
	try
	{
		// Starting SObjectizer.
		so_5::launch(
			// A function for SO Environment initialization.
			[]( so_5::rt::environment_t & env )
			{
				// Creating and registering single agent as a cooperation.
				env.register_agent_as_coop( "coop", new a_hello_t( env ) );
			} );
	}
	catch( const std::exception & ex )
	{
		std::cerr << "Error: " << ex.what() << std::endl;
		return 1;
	}

	return 0;
}

PPPS. Специально для желающих узнать, чем SObjectizer лучше libcppa/CAF. В двух словах — это две совершенно разные разработки, ставящие перед собой разные цели и достигающие их разными способами. Подробнее здесь и здесь.

★★★★★

Последнее исправление: beastie (всего исправлений: 2)
Ответ на: комментарий от eao197

спасибо за комментарий, ценно.

erlyvideo

Работаю над его техподдержкой, и разной другой поддержкой (документацией на сайте, например). Кода движка не пишу, не моего ума дело вмешиваться в такую сложную mission critical штуку. Дисклеймер: мои вопросы никак не связаны с работодателем, и уж тем более не связан эпический троллинг на ЛОРе. Написание серверов для онлайна интересно чисто в личных целях.

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

Интересно. Вообще, судя по ЖЖ автора erlyvideo, вы работаете под началом очень вменяемого товарища. Был немного удивлен вашими вопросами, имхо, у вас на работе есть люди намного более сведущие, чем я. Они наверняка вам больше и лучше расскажут. Если, конечно, время найдется.

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

Любому нормальному человеку приятна хвальба. Хвальба мотивирует на развитие проекта.

Makes sense, правда хвальба - это не совсем мое.

А критика без предложений бессмысленна и непродуктивна.

Предложения довольно очевидны.

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

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

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

И? У вас на работе работают все C++ники мира?

Нет, но несомненно лучшие из них, чо уж там:)

Почему вы думаете, что выборка по вашим коллегам будет репрезентативной?

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

Могли бы вы озвучить характер realtime-задач, которыми вам приходится заниматься?

Текущая работа - обработка звука (да, упомянутые коллеги _не_ работают над тем же). Есть и hard и софт rt, над hard не я работаю. Предыдущая - RTAI (http://www.rtai.org) - непосредственно разработка проекта (реализация hard-rt в линукс).

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

У меня все проще :)

Когда вся эта история давным-давно начиналась, Java еще только вышла в публичный доступ. А Ericsson, если не ошибаюсь, еще только над своим AXD301, который дал Erlang-у путевку в жизнь, работал в поте лица. Так что кроме C++ особо и не было ничего :)

Тем более, что изначально речь шла именно об агентах, термина актор не припомню. Начиналось все из области SCADA. Потом заглохло, потом возродилось, в общем-то, тоже после задачки связанной с оборудованием. Ну а про «модель актеров» мы стали говорить из-за того, что это модная тема нонче, пытаемся воспользоваться шумихой в своих целях :)

Кстати говоря, ядро SO5 совсем небольшое, около 10KLOC, тестов и примеров дам в два раза больше. А вот на базе SO5 было написано довольно много кода. И, как раз за счет того, что при работе с агентами разработчик практически не связывается с многопоточностью, разработка приложений с большим количеством потоков внутри на C++ и SO гораздо проще, чем на обычном C++ (даже с инструментами вроде POCO или ACE). Не было бы SO, может я бы от C++ сам лет десять назад отказался бы, когда казалось, что у плюсов будущего не будет.

Сейчас же плюсы намного лучше стали. Отстреливать себе ноги сложнее, писать более быстрый код проще.

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

Текущая работа - обработка звука (да, упомянутые коллеги _не_ работают над тем же). Есть и hard и софт rt, над hard не я работаю. Предыдущая - RTAI (http://www.rtai.org) - непосредственно разработка проекта (реализация hard-rt в линукс).

Ну вот я о том и говорю :) Когда имеешь отношение к real-time, сокращение RT расшифровывается именно так. По себе знаю.

Но спустя несколько лет после ухода из этой области быстро забывается.

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

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

это многое объясняет :)

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

Может просто пора перестать пить коньяк по утрам?

Или засунуть свое самомнение куда подальше и прочитать что-то кроме CSP?

Или спросить о себе любимом мнение у тех, кто с вами работает?

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

чо ты так взъелся на cspbook, кстати? я подобрал книгу, которая будет наиболее полезна тебе чтобы привести в порядок тот винегрет, который у тебя в голове.

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

Ну вот, опять задета тонкая душевная организация тимлидуса анонимуса.

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

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

чо ты так взъелся на cspbook, кстати?

Где я что-то плохое сказал про CSP?

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

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

мало того, что бегает с кривым молотком и везде ищёт гвозди. ещё и хам. впрочем, я уже об этом говорил.

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

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

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

Или продолжите обзывать меня хамом и продолжать обсуждать мою личность?

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

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

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

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

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

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

покажи.

Раз (нужен односложный ответ «да» или «нет»).

Два (интересно происхождение числа 9000).

Три (подробнее про нарушение инкапсуляции, пожалуйста).

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

1. ты — тролль. единственный вменяемый ответ на этот вопрос — нет. но означает он совсем не то что тебе хочется услышать.

2. интернет-фольклор.

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

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

1. единственный вменяемый ответ на этот вопрос — нет.

Ок.

2. интернет-фольклор.

Т.е. очередной анонимный звиздешь.

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

Многознающий вы наш, какого лешего вы раскрываете рот и пытаетесь учить ничего не зная о предмете разговора? От тимлидерства на четырех проектах крыша течет или таки корона стала жать?

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

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

Про Theron тот же упомянули ни с того, ни с сего. Даже не разобравшись, что пример из Theron-а и пример из стартового сообщения — это совершенно разные примеры, демонстрирующие разные возможности. И Hello, World в духе Theron-а будет записан на SO5 очень и очень похожим способом.

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

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

1. т.е. признаёшь, что пришёл сюда троллить. ок.

2. вопрос не имеет никакого отношения к разговору. тем не менее, я на него ответил.

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

ну и традиционный бугурт вперемешку с оскорблениями.

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

1. т.е. признаёшь, что пришёл сюда троллить. ок.

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

2. вопрос не имеет никакого отношения к разговору. тем не менее, я на него ответил.

Смотрим на первоначальное высказывание:

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

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

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

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

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

Итак, к чему вы приплели нарушение инкапсуляции, если вы о SO4 ничего не знаете? И тем более, не знаете как он работал?

ну и традиционный бугурт вперемешку с оскорблениями.

Это LOR, детка. Хочется вести беседу в духе «автор дебил, код говно», не удивляйтесь последствиям.

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

2. ты действительно дебил: http://lurkmore.to/9000

Это LOR, детка

хуже того, это /development лор-а. где программисты занесены в красную книгу, а основное население — борщевики, тролли и неадекваты.

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

кстати, пжлст, смотри, кому отвечаешь, а то я уж вспоминал, когда же я это написал =)

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

2. ты действительно дебил: http://lurkmore.to/9000

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

Или вы про то, что ваших собственных реализаций было так много, что ни одна из них не выжила?

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

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

Агенты в SObjectizer — это обычные C++ объекты. Но нужно, чтобы они были объектами классов, унаследованных от so_5::rt::agent_t. В базовом классе определены несколько виртуальных методов, которые наследник может перекрыть. В частности, есть методы so_evt_start() и so_evt_finish. Эти методы вызываются автоматически когда агент начинает и заканчивает свою работу внутри SObjectizer RunTime. Собственно, приведенный в стартовом сообщении пример это и показывает.

SObjectizer обеспечивает работу агентов выделяя им рабочий контекст — одну или несколько рабочих нитей. За это внутри SObjectizer отвечают диспетчеры. Когда SObjectizer RunTime стартует (это делает функция so_5::launch из примера), запускается вся необходимая инфраструктура, включая диспетчеры и таймерную нить.

Так же в примере показано, как сразу после запуска RunTime создается один агент, который регистрируется внутри RunTime. В результате чего как раз и дергаются методы so_evt_start и so_evt_finish. Но уже не на контексте главной нити, а на контексте, предоставленном дефолтным диспетчером (который есть в каждом RunTime).

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

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

то поройся в comp.os.unix* для начала.

Это называется «На деревню дедушке». Что не удивительно, учитывая ваш уровень квалификации и манеру общения.

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

Нет, не так. Реализация потоков внутри потоков, это скорее реализация сопрограмм/файберов/зеленых нитей. Когда есть собственный шедулер, который может пускать, вытеснять и возобновлять работу N сопрограмм/файберов посредством M настоящих рабочих нитей ОС. Я слышал о подобных реализациях, но они, во-первых, были сильно привязаны к конкретным платформам и, во-вторых, в коде сопрограмм/файберов с большой осторожностью должны использоваться блокирующие вызовы (например, синхронное взаимодействие с сетью или диском).

У нас же идея в том, что агенты — это конечные автоматы. Они получают сообщение, что-то делают при его обработке, после чего возвращают управление. Диспетчеры позволяют запускать N агентов на M нитях, но при этом диспетчер может только передать сообщение агенту, а потом будет ждать завершения обработки сообщения. Но не сможет ни приостановить обработку сообщения, ни затем возобновить ее.

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

Реализация потоков внутри потоков, это скорее реализация сопрограмм/файберов/зеленых нитей.

ложь

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

ложь

Ну раскройте, раскройте же наконец эту животрепещущую правду! Изобличите наглого лжеца неопровержимыми доказательствами своей правоты!

Просим, просим, просим!

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

А я гляжу тот аноним к тебе совсем неравнодушен, а?

Уж это точно.

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

Я конечно плююсь от примера в ОП (да и от названия самой библиотеки, гг), но анону в этом топике срочно нужно худеть или хоть чуть-чуть обмазаться пруфами посерьезнее чем «гуглите сами, я все сказал!».

PS .На С++ это смотрится ужасно. Хотя внутри оно может все и супер круто, я не знаю.

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

Я конечно плююсь от примера в ОП

А вот лично вам какой бы пример было интересно увидеть?

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

я объясню понятнее :)

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

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

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

попробуй под таким градом оскорблений хоть какую-то простую мысль донеси...

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

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

Ба, батенька, да вы них*я не поняли!

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

А не могли бы вы привести это приписываемое мне утверждение в студию?

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

А не могли бы вы привести это приписываемое мне утверждение в студию?

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

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

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

А вообще интересно как будет выглядеть обработка данных. Например читаем поток из сети, разбираем протокол, пакуем «основные» данные в zip, выливаем полученное в другой сокет. Эта задача ведь хорошо ложится на эту библиотеку? Всякую ерунду (разбор протокола, паковка в зип) можно псевдокодом.

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

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

Т.е. опять «на деревню дедушке»?

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

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

Отторжение вызывает многословность.

Ну это плюсы, тут сложно оверхэд уменьшить. Хорошо еще, что нет необходимости C++03 поддерживать, а то еще больше было бы.

Это не проблема в большом проекте, но в по сути небольшом примере смотрится ужасно.

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

Над наброском примера с протоколом я покурю пока. Но вот в самом SO5 есть такой пример. Там создаются три агента. Первый — a_manager, дает работу второму агенту — worker-у. Тот работу выполняет и отчитывается. Когда a_manager получает отчет, он дает задачу третьему агенту — checker-у, типа проверить результаты. Checker выполняет проверку и присылает свой отчет менеджеру. Проделав заданное количество действий a_manager завершает работу.

Это синтетический пример-имитация, но прообразом worker-а был агент для шифрования пакета данных, а прообразом checker-а — агент для подписи зашифрованного пакета.

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

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