SObjectizer -- это реализация модели акторов для C++, позволяющая программировать на C++ с использованием работающих на разных нитях агентов, общающихся между собой посредством сообщений. SObjectizer существенно упрощает разработку событийно-ориентированных приложений, для параллельной и независимой обработки событий в которых требуется многопоточность и/или распределенность. SObjectizer использовался для создания как для мелких утилит, так и серьезных распределенных приложений, работающих под большой нагрузкой в режиме 24x7.
Последние несколько лет SObjectizer развивается на SourceForge как OpenSource проект под BSD-лицензией. Версия 5.3.0 является очередным существенным шагом по наращиванию возможностей SObjectizer при одновременном упрощении его использования.
В версии 5.3.0 произведены значительные улучшения:
- добавлена возможность организации синхронного взаимодействия агентов: инициатор запроса может синхронно ожидать результата на объекте std::future, в то время как обработчик запроса работает обычным образом на своей рабочей нити;
- более активно используются лямбда-функции, введенные в C++11. Например, теперь обработчики событий могут быть заданы посредством лямбда-функций, что позволяет уменьшить объем кода агентов;
- добавлена возможность создавать ad-hoc агентов, формируя агента из лямбда-функций, а не описывая отдельный, унаследованный от so_5::rt::agent_t, класс;
- доработана модель реагирования на выпущенные из обработчиков событий исключения.
Эта версия так же содержит несколько более мелких исправлений, улучшений, доработок и примеров.
Традиционный пример “Hello, World” теперь может быть записан вот так:
so_5::api::run_so_environment( []( so_5::rt::so_environment_t & env ) { auto coop = env.create_coop( "hello" ); coop->define_agent().on_start( [&env]() { std::cout << "Hello, World" << std::endl; env.stop(); } ); env.register_coop( std::move( coop ) ); } ); |
А более интересный пример ping_pong, где каждый агент работает на контексте своей собственной нити, вот так:
int pings_left = 10000; so_5::api::run_so_environment( [&pings_left]( so_5::rt::so_environment_t & env ) { struct msg_ping : public so_5::rt::signal_t {}; struct msg_pong : public so_5::rt::signal_t {}; auto mbox = env.create_local_mbox(); auto coop = env.create_coop( "ping_pong", so_5::disp::active_obj::create_disp_binder( "active_obj" ) ); coop->define_agent() .on_start( [mbox]() { mbox->deliver_signal< msg_ping >(); } ) .on_event( mbox, so_5::signal< msg_pong >, [&pings_left, &env, mbox]() { if( --pings_left > 0 ) mbox->deliver_signal< msg_ping >(); else env.stop(); } ); coop->define_agent() .on_event( mbox, so_5::signal< msg_ping >, [mbox]() { mbox->deliver_signal< msg_pong >(); } ); env.register_coop( std::move( coop ) ); }, []( so_5::rt::so_environment_params_t & params ) { params.add_named_dispatcher( "active_obj", so_5::disp::active_obj::create_disp() ); } ); |
Версия распространяется в виде сборки so-201407-00, в которую кроме SObjectzer 5.3.0 входит еще несколько SObjectizer-библиотек, предназначенных для разработки больших, распределенных приложений на основе SObjectizer, а именно:
- so_log, служащая оберткой над ACE Logging и упрощающая логирование для агентов;
- so_sysconf, позволяющая собирать большое приложение из маленьких кусочков, оформленных в виде dll/so-библиотек;
- so_5_transport, оформляющая работу с TCP/IP соединениями в виде транспортных SObjectizer-агентов;
- mbapi, являющаяся высокоуровневой библиотекой для обмена сообщениями между агентами или между компонентами распределенного приложения.
Релизная сборка может быть загружена с SourceForge в виде архива или же взята из svn-репозитория.
Wiki-раздел SObjectizer-а на SourceForge содержит более подробную информацию как об особенностях версии 5.3.0, так и о самом SObjectizer и его основах.
Комментариев нет:
Отправить комментарий