-
Notifications
You must be signed in to change notification settings - Fork 4
Example Cluster
ANYKS edited this page Mar 2, 2025
·
9 revisions
#include <core/cluster.hpp>
using namespace awh;
using namespace placeholders;
class Executor {
private:
log_t * _log;
public:
void events(const cluster_t::family_t worker, [[maybe_unused]] const pid_t pid, const cluster_t::event_t event, cluster::core_t * core){
if(event == cluster_t::event_t::START){
switch(static_cast <uint8_t> (worker)){
case static_cast <uint8_t> (cluster_t::family_t::MASTER): {
const char * message = "Hi!";
core->broadcast(message, strlen(message));
} break;
case static_cast <uint8_t> (cluster_t::family_t::CHILDREN): {
const char * message = "Hello";
core->send(message, strlen(message));
} break;
}
}
}
void message(const cluster_t::family_t worker, const pid_t pid, const char * buffer, const size_t size){
switch(static_cast <uint8_t> (worker)){
case static_cast <uint8_t> (cluster_t::family_t::MASTER):
this->_log->print("Message from children [%u]: %s", log_t::flag_t::INFO, pid, string(buffer, size).c_str());
break;
case static_cast <uint8_t> (cluster_t::family_t::CHILDREN):
this->_log->print("Message from master: %s [%u]", log_t::flag_t::INFO, string(buffer, size).c_str(), ::getpid());
break;
}
}
void launched(const awh::core_t::status_t status){
switch(static_cast <uint8_t> (status)){
case static_cast <uint8_t> (awh::core_t::status_t::START):
this->_log->print("%s", log_t::flag_t::INFO, "Start cluster");
break;
case static_cast <uint8_t> (awh::core_t::status_t::STOP):
this->_log->print("%s", log_t::flag_t::INFO, "Stop cluster");
break;
}
}
public:
Executor(log_t * log) : _log(log) {}
};
int32_t main(int32_t argc, char * argv[]){
fmk_t fmk;
log_t log(&fmk);
Executor executor(&log);
cluster::core_t core(&fmk, &log);
log.name("Cluster");
log.format("%H:%M:%S %d.%m.%Y");
core.size();
core.autoRestart(true);
core.callback <void (const awh::core_t::status_t)> ("status", std::bind(&Executor::launched, &executor, _1));
core.callback <void (const cluster_t::family_t, const pid_t, const cluster_t::event_t)> ("events", std::bind(&Executor::events, &executor, _1, _2, _3, &core));
core.callback <void (const cluster_t::family_t, const pid_t, const char *, const size_t)> ("message", std::bind(&Executor::message, &executor, _1, _2, _3, _4));
core.start();
return EXIT_SUCCESS;
}
copyright © ANYKS