пятница, 20 июня 2014 г.

[prog.c++] SObjectizer-5.3.0 уже почти что...

Похоже, в скоуп работ по версии 5.3.0 больше ничего не пойдет (и так достаточно). Заключительная фича, которая была добавлена за последние дни -- это ad-hoc агенты, для которых не нужно описывать отдельных C++ классов, а все их действия можно задать лямбда функциями (описание этой фичи в Wiki). Теперь пример ping-pong, в котором агенты могут обменивать друг с другом простыми сигналами ping и pong, на SObjectizer может быть записан вот так:

void
run_sample(
   const cfg_t & cfg )
   {
      // This variable will be a part of pinger agent's state.
      unsigned int pings_left = cfg.m_request_count;

      so_5::api::run_so_environment(
         [&pings_left, &cfg]( so_5::rt::so_environment_t & env )
         {
            // Types of signals for the agents.
            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",
               // Agents will be active or passive.
               // It depends on sample arguments.
               cfg.m_active_objects ?
                  so_5::disp::active_obj::create_disp_binder( "active_obj" ) :
                  so_5::rt::create_default_disp_binder() );

            // Pinger agent.
            coop->define_agent()
               .on_start( [mbox]() { mbox->deliver_signal< msg_ping >(); } )
               .event( mbox, so_5::signal< msg_pong >,
                  [&pings_left, &env, mbox]()
                  {
                     if( pings_left ) --pings_left;
                     if( pings_left )
                        mbox->deliver_signal< msg_ping >();
                     else
                        env.stop();
                  } );

            // Ponger agent.
            coop->define_agent()
               .event( mbox, so_5::signal< msg_ping >,
                  [mbox]() { mbox->deliver_signal< msg_pong >(); } );

            env.register_coop( std::move( coop ) );
         },
         [&cfg]( so_5::rt::so_environment_params_t & p )
         {
            if( cfg.m_active_objects )
               // Special dispatcher is necessary for agents.
               p.add_named_dispatcher( "active_obj",
                  so_5::disp::active_obj::create_disp() );
         } );
   }

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

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

Так что 5.3 вышла на финишную прямую, по которой еще пилить и пилить... Нужно проверять работу на других платформах. Нужно подтягивать все подпроекты. Нужно сделать в Wiki хоть какое-то элементарное введение в SObjectizer "на пальцах"... Так что отдыхать некогда.

Комментариев нет: