Похоже, в скоуп работ по версии 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 "на пальцах"... Так что отдыхать некогда.
Комментариев нет:
Отправить комментарий