ãã®èšäºã§ã¯ã SObjectizerãã¬ãŒã ã¯ãŒã¯ã§ã®ãšã©ãŒåŠçã®æ¹æ³ã«ã€ããŠèª¬æããŸãã
äŸå€-ã¯ããæ»ãã³ãŒã-ãããïŒ
SObjectizer-4ã2002幎ã«ç»å Žãããšãã倧ããªééããç¯ããŸãããäŸå€ã«ã¯ãªã¿ãŒã³ã³ãŒãã䜿çšããããšã奜ã¿ãŸããã ãããŠãSObjectizer-4ã§ã®ãã®åŸã®éçºçµéšã¯ãã¹ãŠãåçŽãªçå®ãäœåºŠã確信ããŸãããéçºè ããšã©ãŒãäºæž¬ã§ããå Žåãããã¯åœŒã«ãã£ãŠç¡èŠãããŸãã ãããã£ãŠãSObjectizer-5ãäœæãããšãã«ãäŸå€ã䜿çšããŠãšã©ãŒãå ±åããããšã«ããŸããã
ããã¯æ£ããéžæã§ããã çŽäºãæ»ãã³ãŒãã«å¯ŸããäŸå€ãã§ã¯ãæ§ã¯ãŸã å£ããŠããŸãããç§ãã¡ã®çµéšã¯ãäŸãã°ãšãŒãžã§ã³ãã®ãµã€ã³ã¢ããããšãŒãžã§ã³ãã®ååã®ç»é²ãšã©ãŒãªã©ã誀ã£ãŠèŠéãããšãã§ããªãå Žåã«ã®ã¿éçºãåã€ããšã瀺ããŠããŸãã
ãã®ãããSObjectizer-5ã¯ããã®æäœãŸãã¯ãã®æäœãå®è¡ã§ããªãå Žåã«äŸå€ãã¹ããŒããŸãã ã»ãšãã©ã®å Žåããããã®æäœã¯SObjectizerã«ãã§ã«ç»é²ãããŠãããšãŒãžã§ã³ãã«ãã£ãŠå®è¡ãããŸãã ãšãŒãžã§ã³ããäŸå€ã«ééããå Žåã¯ã©ãããã°ããã§ããïŒ
éåžžã®ãšãŒãžã§ã³ãã¯äŸå€ãã¹ããŒãã¹ãã§ã¯ãããŸããïŒ
ããã¯ãäŸå€ã«é¢ããŠãšãŒãžã§ã³ãã«ååšããäž»ãªã«ãŒã«ã§ãã ã€ãã³ãã®åŠçäžã«ãšãŒãžã§ã³ããäŸå€ãåãåã£ãå ŽåïŒSObjectizerãŸãã¯ä»ã®èª°ããäŸå€ãã¹ããŒãããã©ããã¯é¢ä¿ãããŸããïŒããšãŒãžã§ã³ãã¯ãã®äŸå€ãã¹ããŒããŸããã
説æã¯ç°¡åã§ãã SObjectizerã®ãšãŒãžã§ã³ãã«ã¯ãç¬èªã®äœæ¥ã³ã³ããã¹ãããããŸããã 倧ãŸãã«èšãã°ããšãŒãžã§ã³ãã¯èªåãäœæ¥ããã¯ãŒã¯ã¹ã¬ãããææããŠããŸããã äœæ¥ã³ã³ããã¹ãã¯ã次ã®ã€ãã³ãã®åŠçäžã«ãšãŒãžã§ã³ããæ¥ç¶ãããŠãããã£ã¹ãããã£ã«ãã£ãŠæäŸããããã®åŸãå¥ã®ãšãŒãžã§ã³ãã«æäŸã§ããŸãã ç¹å®ã®ãšãŒãžã§ã³ããå€éšã«äŸå€ãã¹ããŒãããšããã®äŸå€ã¯ãã£ã¹ãããã£ã«éãããäœæ¥ã³ã³ããã¹ãã匷調衚瀺ãããŸãã ã¢ããªã±ãŒã·ã§ã³ããã£ã¹ãããã£ã«ã¢ããªã±ãŒã·ã§ã³ã匷å¶çµäºããããåäœãç¶ç¶ããããã決å®ãããããªãå Žåããã®ã¢ããªã±ãŒã·ã§ã³ã®ãšãŒãžã§ã³ãã¯äŸå€åŠçãèªåã§åŠçããå¿ èŠããããŸãã
çæ³çã«ã¯ãããã¯ããšãŒãžã§ã³ãã€ãã³ããã¡ãœãã以å€ã§ããããšãæå³ããŸãã ããããããã¯çæ³çãªã±ãŒã¹ã§ãã C ++ã®noexceptã¡ã«ããºã ã¯è¯ãããšã§ãããnoexceptã¡ãœããã®äŸå€ãå°çããªãããšãä¿èšŒããã ãã§ãã åæã«ãéäŸå€ã¡ãœãããnoexceptã¡ãœããã§åŒã³åºãããå Žåãé£ã³åºãããšãã§ããã³ã³ãã€ã©ãŒã¯æãæã€ããšã¯ãããŸããã ãŸããäŸå€ãåŒãç¶ãçºçããå Žåã¯ãstd :: terminateïŒïŒã«çŽæ¥é²ã¿ãŸãã ããã¯å¿ ãããç§ãã¡ã«é©ããŠããããã§ã¯ãããŸããã ç§ãã¡ãäœãã§ãããã®äžå®å šãªäžçã«ããã«ã¯ã©ãããã°ããã§ããïŒ
SObjectizerã¯ããšãŒãžã§ã³ãããæµåºããäŸå€ãžã®å¯Ÿå¿æ¹æ³ãä¿ãããšãã§ããŸã
ããããšã¯æã çºçããããããšãŒãžã§ã³ãã«äŸå€ã®ãªãä¿èšŒãæäŸããããšãçŽæãããšããŠããééããç¯ãå¯èœæ§ããããŸãããããã§ãäŸå€ã¯å€ã«åºãŸãã ãã£ã¹ãããã£ãŒã¯åœŒãæãŸããŠã次ã«äœããã¹ããã決å®ããŸãã
ãããè¡ãããã«ããã£ã¹ãããã£ã¯åé¡ã®ãããšãŒãžã§ã³ãã§so_exception_reactionïŒïŒä»®æ³ã¡ãœãããåŒã³åºããŸãã ãã®ã¡ãœããã¯ã次ã®å€ã®ãããããè¿ããŸãã
- so_5 :: abort_on_exceptionã ããã«ãããstd :: abortïŒïŒãåŒã³åºãããã¢ããªã±ãŒã·ã§ã³å
šäœãäžæãããŸãã
- so_5 :: shutdown_sobjectizer_on_exceptionã ãã®å€ã¯ããšãŒãžã§ã³ããåºæ¬çãªäŸå€ä¿èšŒïŒã€ãŸãããªãœãŒã¹ãªãŒã¯ãäœãã®æå·ããªãããšïŒãæäŸãããããããªãäœæ¥ãç¶ããæå³ããªãããšãæå³ããŸãã ãããã£ãŠããšãŒãžã§ã³ãã¯ããšãŒãžã§ã³ããã€ãã³ããåŠçã§ããªãç¹å¥ãªç¶æ
ã«ç§»è¡ããSObjectizer Environmentã¯std :: abortïŒïŒãåŒã³åºããã«æ£åžžã«å®äºããŸãã åæã«ãç»é²ãããŠãããã¹ãŠã®ååçµåãé©åã«ç»é²è§£é€ããããããä»ã®ãšãŒãžã§ã³ãã¯éåžžã©ããäœæ¥ãå®äºãããªãœãŒã¹ãã¯ãªãŒã³ã¢ããã§ããŸãã è€æ°ã®SObjectizer Environmentãã¢ããªã±ãŒã·ã§ã³ã§åæã«æ©èœããããšã«æ³šæããŠãã ããã shutdown_sobjectizer_on_exceptionã®å ŽåãäŸå€ããã£ãããããSObjectizer Environmentã®ã¿ãçµäºããŸãã
- so_5 :: deregister_coop_on_exceptionã ãã®å€ã¯ããšãŒãžã§ã³ããåºæ¬çãªäŸå€ä¿èšŒãæäŸããã¢ããªã±ãŒã·ã§ã³ããã®ãšãŒãžã§ã³ããšãã®ååãªãã§äœæ¥ãç¶è¡ã§ããããšãæå³ããŸãã ãããã£ãŠããšãŒãžã§ã³ãã¯ç¹å¥ãªç¶æ
ã«ç§»è¡ããããã®ååã¯éåžžã®æ¹æ³ã§ç»é²è§£é€ãããŸãïŒããã«ãããä»ã®ååãšãŒãžã§ã³ããæ£åžžã«äœæ¥ãå®äºã§ããããã«ãªããŸãïŒã
- so_5 :: ignore_exceptionã ãã®å€ã¯ããšãŒãžã§ã³ãã匷åãªäŸå€ä¿èšŒãæäŸããããšãæå³ããŸãïŒã€ãŸãããªãœãŒã¹ãªãŒã¯ãäœããžã®æå·ããªããããšãŒãžã§ã³ããæ£ããç¶æ ã®ãŸãŸã«ãªããŸãïŒã ãããã£ãŠããã£ã¹ãããã£ã¯äŸå€ãååšããªããã®ããã«ãåã«ç¡èŠããŸãã
ignore_exceptionã®ãããªãªãã·ã§ã³ãæã€ããšã¯ãéåžžã®ãšãŒãžã§ã³ããå€éšã«äŸå€ãã¹ããŒããŠã¯ãªããªããšè¿°ã¹ãããåŸãå¥åŠã«èŠãããããããŸããã ãã ããå®éã«ã¯ããã®å€ãæã€ããšã¯ãéåžžã«åçŽãªã€ãã³ããã³ãã©ãŒãæã€ãšãŒãžã§ã³ãã«ãšã£ãŠäŸ¿å©ã§ãã ããšãã°ããšãŒãžã§ã³ãã¯ã¿ã€ãM1ã®ã¡ãã»ãŒãžãåä¿¡ãããããã¿ã€ãM2ã®ã¡ãã»ãŒãžã«å€æããŸãã å€æäžã«äŸå€ãçºçããå ŽåããããŸãããå¹æã¯ã»ãšãã©ãããŸããããšãŒãžã§ã³ãã®ç¶æ ã¯å£ããŠããããã¡ãã»ãŒãžM2ã¯å€±ãããŠããŸããã¡ãã»ãŒãžã¯äœããã®çç±ã§å€±ãããå¯èœæ§ããããŸãã ãã®ãããªå Žåãåã€ãã³ããã³ãã©ãŒã«try-catchãããã¯ãå«ãããããããã£ã¹ãããã£ãäŸå€ãç¡èŠããããã«ãåçŽãªãšãŒãžã§ã³ãããäŸå€ãé£ã°ãæ¹ãç°¡åã§ãã
ãããã£ãŠãããã°ã©ããŒã¯ããšãŒãžã§ã³ãã«æé©ãªãªãã·ã§ã³ãèªåã§æ±ºå®ããso_exception_reactionïŒïŒã¡ãœããããªãŒããŒã©ã€ãããŠãSObjectizerã«äŸå€ããã£ããããåŸã®æ¹æ³ãéç¥ã§ããŸãã
using namespace so_5; // , M1 mbox- src // M2 mbox- dest. , // , . class my_simple_message_translator final : public agent_t { public : my_simple_message_translator( context_t ctx, mbox_t src, mbox_t dest ) : agent_t( ctx ) { so_subscribe( src ).event( [dest]( const M1 & msg ){ send< M2 >( dest, ... );} ); } // SO-5, . virtual exception_reaction_t so_exception_reaction() const override { return ignore_exception; } };
ååã®äŸå€
agent_t :: so_exception_reactionïŒïŒã®æšæºå®è£ ã¯ããšãŒãžã§ã³ããå±ããååã®exception_reactionïŒïŒã¡ãœãããåŒãåºããŸãã ã€ãŸã ããã©ã«ãã§ã¯ããšãŒãžã§ã³ãã¯é£æºããäŸå€å¿çãç¶æ¿ããŸãã ãããŠããã®åå¿ã¯ãååãç»é²ãããšãã«èšå®ã§ããŸãã
äŸïŒ
// , // . env.introduce_coop( []( coop_t & coop ) { coop.set_exception_reaction( deregister_coop_on_exception ); coop.make_agent< some_agent >(...); ... } );
ãããã£ãŠãSObjectizerã§ã¯ãäŸå€ã«å¯Ÿããå¿çããšãŒãžã§ã³ãã¬ãã«ã§èšå®ã§ããŸãããããè¡ãããŠããªãå ŽåããšãŒãžã§ã³ãã®ååã«å¯ŸããŠæå®ãããäŸå€ã«å¯Ÿããå¿çã䜿çšãããŸãã
ããããååãäœæãããšãã«set_exception_reactionïŒïŒã¡ãœãããåŒã³åºãããªãïŒãããŠã»ãšãã©ã®å ŽåãåŒã³åºãããªãïŒå Žåã¯ã©ããªããŸããïŒ
ããã°ã©ããcoop_t :: set_exception_reactionïŒïŒãæ瀺çã«åŒã³åºããªãã£ãå Žåãcoop_t :: exception_reactionïŒïŒã¯ç¹å¥ãªå€-so_5 :: inherit_exception_reactionãè¿ããŸãã ãã®å€ã¯ãååã芪ã®ååã®æé€åå¿ãç¶æ¿ããããšã瀺ããŸãã ãã®èŠªã®ååãååšããå ŽåãSObjectizerã¯exception_reactionïŒïŒãåŒã³åºããŸãã 芪ã®ååãso_5 :: inherit_exception_reactionãè¿ãå ŽåãSObjectizerã¯èŠªã®ååã®èŠªãªã©ã«å¯ŸããŠexception_reactionïŒïŒãåŒã³åºããŸãã
æçµçã«ã次ã®èŠªã®ååããªãããšãå€æãããããããŸããã ãã®å ŽåãSObjectizerã¯environment_tå šäœã«å¯ŸããŠexception_reactionïŒïŒãåŒã³åºããŸãã ãããŠããã§ã«environment_t :: exception_reactionïŒïŒã¯å€so_5 :: abort_on_exceptionãè¿ããŸãã ããã«ãããstd :: abortïŒïŒãåŒã³åºãããšã«ãããã¢ããªã±ãŒã·ã§ã³å šäœã厩å£ããŸãã
ãã ããããã°ã©ãã¯SObjectizerç°å¢å šäœã«å¯ŸããŠäŸå€å¿çãèšå®ã§ããŸãã ããã¯ãèµ·åæã«SObjectizerã®ããããã£ãèšå®ããããšã§å®è¡ãããŸãã
so_5::launch( []( environment_t & env ) {...}, []( environment_params_t & params ) { params.exception_reaction( shutdown_sobjectizer_on_exception ); ... } );
å°ãäžéçãªèŠçŽ
ãããã£ãŠããšãŒãžã§ã³ããäŸå€ãã¹ããŒããå ŽåãSObjectizerã¯ãããã€ã³ã¿ãŒã»ããããagent_t :: so_exception_reactionïŒïŒãåŒã³åºããŠããšãŒãžã§ã³ãã«äŸå€ãã©ãããããå°ããŸãã ããã°ã©ããŒãso_exception_reactionïŒïŒãåå®çŸ©ããªãã£ãå ŽåãäŸå€ãžã®å¿çã¯ããšãŒãžã§ã³ããå ¥åããååã«ãã£ãŠæ±ºå®ãããŸãã
éåžžãã³ã©ãã¬ãŒã·ã§ã³ã¯ã芪ããäŸå€å¿çãç¶æ¿ããããšãSObjectizerã«äŒããŸãã SObjectizerã¯ãä¿è·è ã®ååãæ±ããŸãã ãã®åŸã芪ãšèŠªã®ååãªã©ã ãããŠã芪ããªããªããšãSObjectizerã¯ãenvironment_tããäŸå€ãžã®å¿çãèŠæ±ããŸãããã®äžã§ãåé¡ã®ãããšãŒãžã§ã³ãã¯åäœããŸãã ããã©ã«ãã§ã¯ãenvironment_tã¯ãstd :: abortïŒïŒãžã®åŒã³åºãã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ãäžæããå¿ èŠãããããšãéç¥ããŸãã ãããã£ãŠãããã°ã©ãã¯ããŸããŸãªã¬ãã«ã§äŸå€ã®çºçã«åœ±é¿ãäžããããšãã§ããŸãã
- ãšãŒãžã§ã³ãèªäœã§ããšãŒãžã§ã³ãã€ãã³ãå ã®ãã¹ãŠã®äŸå€ããã£ããããããso_exception_reactionïŒïŒããªãŒããŒã©ã€ãããŸãã
- ãšãŒãžã§ã³ãã®ååãŸãã¯èŠªã®ååã«ãããŠ;
- SObjectizerç°å¢ã§ã¯ããšãŒãžã§ã³ããšã³ã©ãã¬ãŒã·ã§ã³ãæ©èœããŸãã
ååã®ç»é²è§£é€ã«ã©ã®ããã«å¯Ÿå¿ããŸããïŒ
äžèšã®ããã«ãSObjectizerã¯ãããŸããŸãªæ¹æ³ã§ãšãŒãžã§ã³ãããã¹ããŒãããäŸå€ã«å¿çã§ããŸãã ãã¶ããäŸãã°ãåé¡ã®ããååã ããç»é²è§£é€ããã§ãããã ãããããã®åå¿ã®ãã€ã³ãã¯äœã§ããïŒ çµå±ã®ãšãããååã¯ã¢ããªã±ãŒã·ã§ã³ã«é©çšãããããã€ãã®åé¡ã解決ããããã解決ããªããã°ãããã¯ååšããªãã£ãã§ãããã ãããŠããã®ååã¯çªç¶æ¶ããŸã...ã©ã®ããã«ããã調ã¹ãã©ã®ããã«ããã«åå¿ããã®ã§ããïŒ
SObjectizerã䜿çšãããšãäœããã®ååãç»é²è§£é€ããããšããéç¥ãåãåãããšãã§ããŸãã ããã€ãã®ç¹ã§ããã®ã¡ã«ããºã ã¯Erlangã®ããã»ã¹ãç£èŠããæ©èœã«äŒŒãŠããŸããããšãã°ãerlangïŒmonitorïŒprocessãPidïŒãåŒã³åºãããšãã§ããPidããã»ã¹ãçµäºãããšãã¡ãã»ãŒãž{'DOWN'ã...}ãåä¿¡ãããŸãã
SObjectizerã«ã¯ãç»é²è§£é€ã€ãã³ãã§éç¥æ©èœãããã³ã°ããããæ©èœããããŸãã notifierã¯ãã³ã©ãã¬ãŒã·ã§ã³ã®ç»é²è§£é€ãå®äºãããšSObjectizerãèªåçã«åŒã³åºããã¡ã³ã¯ã¿ãŒã§ãã SObjectizerã¯ãç»é²è§£é€ãããååã®ååãšç»é²è§£é€ã®çç±ã®äž¡æ¹ããã®ãã¡ã³ã¯ã¿ãŒã«æž¡ããŸãã ãã®ãã¡ã³ã¯ã¿ãŒã¯ãã¢ããªã±ãŒã·ã§ã³ãå¿ èŠãšããããšãå®è¡ã§ããŸãã ããšãã°ãååé¢ä¿ã®æ¶å€±ã«ã€ããŠé¢å¿ã®ãããšãŒãžã§ã³ãã«ã¡ãã»ãŒãžãéä¿¡ã§ããŸãã ãŸãã¯ãåã«ååé¢ä¿ãåç»é²ã§ããŸãã
// // - . #include <iostream> #include <so_5/all.hpp> void start_coop( so_5::environment_t & env ) { env.introduce_coop( [&]( so_5::coop_t & coop ) { struct raise_exception : public so_5::signal_t {}; // . // . auto agent = coop.define_agent(); agent.on_start( [agent] { so_5::send_delayed< raise_exception >( agent, std::chrono::seconds(1) ); } ) .event< raise_exception >( agent, [] { throw std::runtime_error( "Just a test exception" ); } ); // SObjectizer- . coop.set_exception_reaction( so_5::deregister_coop_on_exception ); // , // , , . coop.add_dereg_notificator( []( so_5::environment_t & env, const std::string & coop_name, const so_5::coop_dereg_reason_t & why ) { std::cout << "Deregistered: " << coop_name << ", reason: " << why.reason() << std::endl; if( so_5::dereg_reason::unhandled_exception == why.reason() ) start_coop( env ); } ); } ); } int main() { so_5::launch( []( so_5::environment_t & env ) { // . start_coop( env ); // . std::this_thread::sleep_for( std::chrono::seconds( 5 ) ); // . env.stop(); } ); }
Slangã«ã¯ãErlangã®ãããªæ¢è£œã®ã¹ãŒããŒãã€ã¶ãŒã·ã¹ãã ã¯ãããŸããã ã©ããããããç§ã¯åœŒå¥³ãªãã§è¡ãããšãã§ããŸããã ãã ããé©çšãããã¿ã¹ã¯ã«å¿ èŠãªå Žåã¯ãéç¥æ©èœã«åºã¥ããŠé¡äŒŒã®ãã®ãåéã§ããŸãã
æåŸã®å²åŠççºèš
C ++ã¯å®å šã§ãªãèšèªã§ãã ãããŠãäŸå€ã®å®å šæ§ã®å°ãªããšãåºæ¬çãªä¿èšŒãæäŸããã³ãŒããæžãã«ã¯ãéçºè ã®ããããã®åªåãå¿ èŠã§ãã ãããã£ãŠãã¢ã¯ã¿ãŒãC ++ã§å®è£ ããå Žåããã§ã€ã«ãã¡ãŒã¹ãã®ååã®äœ¿çšã«æ³šæããå¿ èŠããããŸãã ããã¯Erlangã§è¯ãã§ã-ããã»ã¹ã§åé¡ãèŠã€ãã£ãå Žåã圌ãã¯ããã»ã¹ã匷å¶çµäºãããã®åŸErlang VMã¯ãã®åŸãã¹ãŠãã¯ãªãŒã³ã¢ãããã察å¿ããã¹ãŒããŒãã€ã¶ãŒã¯å€±æããããã»ã¹ã§ã¯ãªãæ°ããããã»ã¹ãéå§ããŸããã
C ++ã§ã¯ããã¹ãŠã®ãšãŒãžã§ã³ãã¯åãããã»ã¹å ã«ååšããŸãã ãããã£ãŠããšãŒãžã§ã³ãã®1ã€ãååã«å®è£ ãããŠããªãå ŽåããªãœãŒã¹ã®ãªãŒã¯ãããã»ã¹ã®ã¡ã¢ãªå ã®äœããžã®æå·ãèæ ®ããŠãç»é²è§£é€ããããšãŒãžã§ã³ãã®ä»£ããã«ç»é²è§£é€ãšããã«ç¶ãæ°ãããšãŒãžã§ã³ãã®äœæã¯è§£æ±ºçã§ã¯ãªããããããŸããããããã«å€§ããªåé¡ã§ãã
ãããåå ã§ãSObjectizerã§ã¯ãããã©ã«ãã§ããšãŒãžã§ã³ãã®1ã€ãäŸå€ãã¹ããŒãããšãã¢ããªã±ãŒã·ã§ã³å šäœãäžæãããŸãã ããã°ã©ããŒãããã«æºè¶³ããããªã¢ã¯ã·ã§ã³ãä»ã®ãªã¢ã¯ã·ã§ã³ïŒç¹ã«ignore_exceptionãªã¢ã¯ã·ã§ã³ïŒã«å€æŽããããšããå ŽåãäŸå€ã®å®å šæ§ã確ä¿ããããã«ãšãŒãžã§ã³ãã³ãŒããæ éã«æ€èšããæ éã«ãã§ãã¯ããå¿ èŠããããŸãã
ãããã«
ãããããã®èšäºã§ã¯ãSObjectizerã®äž»ãªç¹åŸŽçãªæ©èœã«ã€ããŠã®è©±ãç· ãããããŸãã äœãæ°ãããã®ãç»å ŽããããSObjectizerã«é¢ãã以äžã®èšäºããªãªãŒã¹ããŸãã ãŸãããŸãã¯èå³æ·±ã質åã«åºããããå Žåãã©ãã«å®å šãªçããåºãã®ã¯å°é£ã§ãã
åæã«ããã®æ©äŒãå©çšããŠã 10æ22æ¥ã«ãã³ã¹ã¯ã§éå¬ãããCorehard C ++ Autumn 2016ã«ã³ãã¡ã¬ã³ã¹ã«ãæåŸ ããŸãã ãŸããC ++ã«é¢é£ããã¢ã¯ã¿ãŒã®ã¢ãã«ã«é¢ããã¬ããŒãããããŸãã SObjectizerãå«ãã