91 std::cout <<
"=== Multi-Process Monitoring Integration Example ===\n\n";
94 auto monitoring = std::make_shared<sample_monitoring>();
100 auto primary_pool = std::make_shared<thread_pool>(
"primary_pool", context);
101 auto secondary_pool = std::make_shared<thread_pool>(
"secondary_pool", context);
104 std::cout <<
formatter::format(
"Primary pool instance ID: {}\n", primary_pool->get_pool_instance_id());
105 std::cout <<
formatter::format(
"Secondary pool instance ID: {}\n\n", secondary_pool->get_pool_instance_id());
109 std::vector<std::unique_ptr<thread_worker>> workers;
110 for (
int i = 0; i < 3; ++i) workers.push_back(std::make_unique<thread_worker>());
111 auto r = primary_pool->enqueue_batch(std::move(workers));
113 std::cerr <<
"Failed to add workers to primary_pool: " << r.error().message <<
"\n";
118 std::vector<std::unique_ptr<thread_worker>> workers;
119 for (
int i = 0; i < 2; ++i) workers.push_back(std::make_unique<thread_worker>());
120 auto r = secondary_pool->enqueue_batch(std::move(workers));
122 std::cerr <<
"Failed to add workers to secondary_pool: " << r.error().message <<
"\n";
127 auto start_primary = primary_pool->start();
128 if (start_primary.is_err()) {
129 std::cerr <<
"Failed to start primary_pool: " << start_primary.error().message <<
"\n";
132 auto start_secondary = secondary_pool->start();
133 if (start_secondary.is_err()) {
134 std::cerr <<
"Failed to start secondary_pool: " << start_secondary.error().message <<
"\n";
139 primary_pool->report_metrics();
140 secondary_pool->report_metrics();
142 std::cout <<
"\n--- Submitting jobs ---\n";
145 for (
int i = 0; i < 10; ++i) {
146 auto job = std::make_unique<callback_job>(
148 std::this_thread::sleep_for(std::chrono::milliseconds(50 + i * 10));
150 return kcenon::common::ok();
154 auto r = primary_pool->enqueue(std::move(
job));
156 std::cerr <<
"enqueue to primary_pool failed: " << r.error().message <<
"\n";
161 for (
int i = 0; i < 5; ++i) {
162 auto job = std::make_unique<callback_job>(
164 std::this_thread::sleep_for(std::chrono::milliseconds(100));
166 return kcenon::common::ok();
170 auto r = secondary_pool->enqueue(std::move(
job));
172 std::cerr <<
"enqueue to secondary_pool failed: " << r.error().message <<
"\n";
177 for (
int i = 0; i < 3; ++i) {
178 std::this_thread::sleep_for(std::chrono::milliseconds(200));
179 std::cout <<
"\n--- Metrics Update ---\n";
180 primary_pool->report_metrics();
181 secondary_pool->report_metrics();
185 std::cout <<
"\n--- Stopping pools ---\n";
186 auto stop_primary = primary_pool->stop();
187 if (stop_primary.is_err()) {
188 std::cerr <<
"Error stopping primary_pool: " << stop_primary.error().message <<
"\n";
190 auto stop_secondary = secondary_pool->stop();
191 if (stop_secondary.is_err()) {
192 std::cerr <<
"Error stopping secondary_pool: " << stop_secondary.error().message <<
"\n";
196 std::cout <<
"\n--- Final Metrics ---\n";
197 primary_pool->report_metrics();
198 secondary_pool->report_metrics();
200 std::cout <<
"\n=== Example completed ===\n";
Context object that provides access to optional services.
Context object providing access to optional thread system services.