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

ух ты, в цпп ещё и многопоточность есть

В C++11 «искаропки» :)

/me посмотрел на актуальный геймдев.
А мужики то и не знают!

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

А мужики то и не знают!

Ну, по слухам, в hardcore гемдеве очень специфическое подмножество C++ используют :)

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

По моему уже говорили про доступ к event loop в asio http://evgeny-lazin.blogspot.ru/2009/02/boostasio.html?m=1

Кстати. Характерный момент. Тут уже несколько чуваков, строящих из себя крутых спецов, в разных темах жаловались на отсутствие возможности встраивания в event loop asio. Но никто из них не рассказал, как он форкнул asio (этож открытый проект под хорошей лицензией), добавил в форк нужную ему функциональность, протестировал, задокументировал и выложил форк в открытый доступ и/или предложил разработчикам asio влить свои правки в основную ветку разработки. Если это такая уж востребованная фича, то почему бы не помочь авторам asio реализовать ее.

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

SObjectizer не решает проблем

уточню. он вообще никаких проблем не решает.

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

ща этот недаекват тебя говном закидает

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

никто из них не рассказал, как он форкнул asio

у тебя опенсорц головного мозга

требую извенений в следующей форме:

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

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

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

если ты про меня, то и тот тоже :)

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

требую извенений

Лолшто?

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

задачи обедающих философов

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

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

производителя-потребителя с возможностью расширения

Крайне не понятная постановка задачи.

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

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

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

Похожую, но ведь не философов же.

Если вы настаиваете на задаче философов, то давайте поговорим вот о чем:

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

- каким образом вы собираетесь валидировать решение?

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

Странно, это довольно распространенный паттерн и в уточнении он не сильно нуждается.

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

какой именно из алгоритмов

тот, который наиболее удобен для твоей «библиотеки»

валидировать решение

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

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

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

Высокомерный вы наш, давайте оставим за скобками разговора ваше мнение о моих способностях.

Задача producer-consumer была бы уместна в данном треде, если бы речь шла о библиотеке с реализацией producer-consumer очередей. Но вы, похоже, не только не понимаете, для каких задач подходит SObjectizer, но и упорно не хотите этого узнать.

В качестве примера расскажу об одном из вариантов использования SO из прошлого опыта, там как раз что-то вроде producer-consumer взаимодействия агентов было. В крайне упрощенном виде там было так:

Был агент MD, который вычитывал сообщения из MQ-шной очереди. MD определял компонент-получатель сообщения и отсылал сообщение этому компоненту. Компонент же состоял из пары агентов: R и P. Агент R собирал сообщения в пакеты, размер которых определялся конфигурацией. Все, что не помещалось в пакет, выбрасывалось (таким образом обеспечивалась защита от всплесков нагрузки, не обработанные сообщения все равно затем повторялись и заново вычитывались из MQ). Кроме того, R отвечал за фильтрацию дубликатов.

Агент P работал на потактовой основе. В начале такта он забирал у R собранный пакет данных, обрабатывал и сохранял в БД. Так же из БД выбирались данные для следующей стадии обработки и отсылке следующему компоненту системы. Ну и еще несколько действий, которые нужно было регулярно выполнять над данными в БД. Если после всех этих действий так еще не заканчивался, то агент засыпал до начала следующего такта.

Пар агентов R и P в компоненте было несколько штук, каждая пара обрабатывала свой набор типов сообщений из MQ (на каждую пару два-три типа сообщений). Т.к. агенты R работали очень быстро, они все разделяли одну общую нить. А вот агенты P за счет операций с БД были активными объектами, т.е. работали на своих собственных нитях.

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

Собственно для решения такого уровня задач создавался SObjectizer. Если вы находите здесь аналогии с stl-алгоритмами или считаете, что SObjectizer должен подходить для реализации event-loop-ов для работы с select/epoll/IOCP и т.д., то вы сильно заблуждаетесь.

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

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

Да блин, это говорит тимлид... Который еще настойчиво обзывает меня «непрограммистом». Не позорьтесь публично.

PS. Кстати, не «тестеры», а «тестировщики». Имейте уважение к людям, которые занимаются неблагодарной, но нужной работой.

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

Итак, специальную олимпиаду прошу считать открытой!

Решение для философов будет не раньше вечера завтрашнего дня. Ночью сидеть за компом не буду :)

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

Да какой нахер тимлид, «физик-теоретик» это, сидит себе на диване, мысленные эксперименты проводит типа кота Шредингера

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

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

что с философами? твоя «библиотека» хотя бы в этой классической задаче конкурентности что-то даёт юзеру?

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

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

в этой классической задаче конкурентности что-то даёт юзеру?

От есть у меня подозрение, что вас вообще никакое решение не устроит. Потому что всегда будет отмазка типа «ничего не дает юзеру» или даже «код говно».

Я ведь не зря спросил, как вы валидировать предоставленное решение собираетесь. Ну вот выложу я код. И что дальше? Где будет объективный критерий, который покажет, что код задачу решает?

нехорошие слова в адрес легиона оборачиваются

Вау, имя вам легион!!!

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

вообще никакое решение не устроит

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

Вау, имя вам легион!!!

для тебя это новость?

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

Итак, специальную олимпиаду прошу считать открытой!

Кстати говоря, когда-то на The Computer Language Benchmark Game был такой простой бенчмарк chameneos. Четыре хамелеона разных цветов должны были N раз приходить на место встречи. На это место одновременно могли войти только два хамелеона, остальные должны были ждать, пока место освободится. Те, что попали на место встречи, должны были обменяться цветами и уйти с места встречи. Когда каждый хамелеон N раз побывает на месте встречи, тест завершается. Потом, правда, простой вариант chameneos заменили на чуть усложненный chameneos_redux.

Но вот простой вариант chameneos я давным-давно делал с помощью ACE. Вот код этого варианта.

Не так давно этот же тест был реализован и на SO, вот его код в стандартных примерах SO-5.5.0. (Вот подробное описание этого теста для версии 5.3)

Понятно, что код на SO объемнее. Но, с другой стороны, в нем нет ни одного mutex-а, ни одного condition-а, ни одной явной команды на создание/завершение/ожидание рабочей нити. Так что в логике разобраться проще. Кто не верит, пусть попробует с ходу понять, зачем в ACE-овском варианте два condition-а.

PS. Помнится, когда я делал ACE-овскую реализацию, то нашел баг в одной из реализаций этого теста на Benchmark Game-е: для какого-то языка была реализация, в которой один из хамелеонов вообще не участвовал в проведении встреч.

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

я заранее определил правила игры.

Не видел ни одного зафиксированного критерия.

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

Как вы собираетесь оформлять тест-кейсы для примера с философами?

после этого сравниваем с реализацией на libc/libpthread и обёртками вокруг них.

Во-первых, кто будет писать эти реализации?

Во-вторых, походу, вам нужно, чтобы каждый философ был отдельной нитью?

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

Аноним, не представишь код...

Так я ему уже показал вариант. Так что много ему думать не придется :)

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

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

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

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

выводы очевидны.

/thread

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

не говоря уже о нормальной реализации на семафорах.

Мудозвон Батькович, вы бы ответили сначала на вопрос, зачем в ACE-овской реализации _два_ кондишена. А то ведь не знаете и трындите про реализацию на семафорах.

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

опять хамим?

во-первых, обе реализации смотрел по диагонали.

во-вторых, этот вопрос слышу впервые.

во-третьих, мы говорили о философах, а ты мне впариваешь хамелеонов. некрасиво так с темы съезжать.

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

опять хамим?

Опять жалуемся на последствия собственного поведения.

во-первых, обе реализации смотрел по диагонали.

И сходу 3.14издим о том, в чем не разобрались? Традиционное поведение, предсказуемое.

во-вторых, этот вопрос слышу впервые.

Читать не умеем? Бывает. Специально для тимлидусов анонимусов:

Понятно, что код на SO объемнее. Но, с другой стороны, в нем нет ни одного mutex-а, ни одного condition-а, ни одной явной команды на создание/завершение/ожидание рабочей нити. Так что в логике разобраться проще. Кто не верит, пусть попробует с ходу понять, зачем в ACE-овском варианте два condition-а.

во-третьих, мы говорили о философах, а ты мне впариваешь хамелеонов. некрасиво так с темы съезжать.

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

На счет философов очень бы хотелось, чтобы вы, Мудозвон Батькович, нашли время и ответили на два вопроса, поставленных вот здесь. Зная ваше внимательное отношение к деталям, на всякий случай повторю здесь и добавлю еще один вопрос:

Во-первых, кто будет писать эти реализации (в смысле реализации на libc/libpthread)?

Во-вторых, походу, вам нужно, чтобы каждый философ был отдельной нитью?

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

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

Коллега, как я понял этот аноним так и не представит свой вариант кода.

Предлагаю забить на дальнейшее препирательство с ним и совершенно заслуженно наречь его пиздаболом!

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

Предлагаю забить на дальнейшее препирательство с ним

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

и совершенно заслуженно наречь его пиздаболом!

Он это уже давно заслужил. Даже еще и не в этой начатой мной теме, а в предыдущих.

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

Во-первых

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

Во-вторых

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

В-третьих

опять таки традиционно у философа есть 2 метода: Eat() и Think(), которые обозначают работу потока с использованием разделяемых ресурсов и без такового соответственно.

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

анончик, ты задачки попутал

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

опять таки традиционно у философа есть 2 метода: Eat() и Think(), которые обозначают работу потока с использованием разделяемых ресурсов и без такового соответственно.

Повторю еще раз, специально для тимлидов.

Вопрос был вот о чем: должен ли код философа выглядеть как

while(1)
{
  think();
  eat();
}
или же
while(1)
{
  sleep();
  think();
  eat();
}

Разница тут в том, что think — это процесс захвата разделяемых ресурсов. Т.е. философ сунулся за вилкой, ее не оказалось, он задумался. Посему Eat — это работа с занятыми ресурсами, Think — это борьба за ресурсы. Может ли быть еще что-то, что делает философ, пока не борется за ресурсы и не работает с захваченными ресурсами?

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

один, очевидно же.

Задача обедающих философов с одним обедающим философом? Оригинально, однако.

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

к сожалению это единственный профит от таких

Да всего этого спора не было бы, если бы он не начал говном кидаться и обзывать тех, кто свой труд в эту разработку вложил. На словах у анонима все просто, любой программист может написать свой собственный Erlang. На деле же, пусть кто угодно попробует написать что-нибудь объемом более 5KLOC, снабдить все это тестами, примерами и документацией.

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

Так что, надеюсь, есть еще польза от этого срача.

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

ты не против пользоваться стандартной постановкой задачи? где думать — это думать (virtual void Think() = 0, например), а не хвататься за вилки.

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

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

этим в треде занимаешься только ты

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

ты не против пользоваться стандартной постановкой задачи?

Определение в студию. Я исхожу из того, что написано в Wikipedia:

  • think until the left fork is available; when it is, pick it up;
  • think until the right fork is available; when it is, pick it up;
  • when both forks are held, eat for a fixed amount of time;
  • then, put the right fork down;
  • then, put the left fork down;
  • repeat from the beginning.

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

где думать — это думать (virtual void Think() = 0, например), а не хвататься за вилки.

В формулировке из Wiki нет никаких virtual void Think().

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

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

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