49 std::cout <<
"\n=== Thread Pool with External Logger ===\n" << std::endl;
52 auto logger = std::make_shared<mock_logger>();
60 auto pool = std::make_shared<thread_pool>(
"LoggedPool", context);
63 std::vector<std::unique_ptr<thread_worker>> workers;
64 for (
int i = 0; i < 4; ++i) {
65 workers.push_back(std::make_unique<thread_worker>());
68 auto r = pool->enqueue_batch(std::move(workers));
70 std::cerr <<
"enqueue_batch failed: " << r.error().message << std::endl;
77 auto r = pool->start();
79 std::cerr <<
"start failed: " << r.error().message << std::endl;
85 for (
int i = 0; i < 10; ++i) {
86 auto r = pool->enqueue(std::make_unique<callback_job>(
87 [i, &context]() -> kcenon::common::VoidResult {
89 context.log(log_level_v2::info,
90 "Executing job " + std::to_string(i));
93 std::this_thread::sleep_for(std::chrono::milliseconds(50));
95 return kcenon::common::ok();
99 std::cerr <<
"enqueue failed: " << r.error().message << std::endl;
104 std::this_thread::sleep_for(std::chrono::seconds(1));
106 auto r = pool->stop();
108 std::cerr <<
"stop failed: " << r.error().message << std::endl;
121 std::cout <<
"\n=== Thread Pool with External Monitoring ===\n" << std::endl;
124 auto monitor = std::make_shared<mock_monitoring>();
132 auto pool = std::make_shared<thread_pool>(
"MonitoredPool", context);
135 std::vector<std::unique_ptr<thread_worker>> workers;
136 for (
int i = 0; i < 4; ++i) {
137 workers.push_back(std::make_unique<thread_worker>());
140 auto r = pool->enqueue_batch(std::move(workers));
142 std::cerr <<
"enqueue_batch failed: " << r.error().message << std::endl;
147 auto r = pool->start();
149 std::cerr <<
"start failed: " << r.error().message << std::endl;
155 std::cout <<
"Submitting jobs and monitoring performance..." << std::endl;
157 for (
int batch = 0; batch < 3; ++batch) {
159 for (
int i = 0; i < 20; ++i) {
160 auto r = pool->enqueue(std::make_unique<callback_job>(
161 [&context]() -> kcenon::common::VoidResult {
163 std::this_thread::sleep_for(
164 std::chrono::milliseconds(10 + rand() % 40));
165 return kcenon::common::ok();
169 std::cerr <<
"enqueue failed: " << r.error().message << std::endl;
174 std::this_thread::sleep_for(std::chrono::milliseconds(500));
176 auto snapshot_result = monitor->get_metrics();
177 if (snapshot_result.is_ok()) {
178 const auto& snapshot = snapshot_result.value();
179 std::cout <<
"Batch " << batch + 1 <<
" metrics:" << std::endl;
180 std::cout <<
" Total metrics recorded: " << snapshot.metrics.size() << std::endl;
186 auto r = pool->stop();
188 std::cerr <<
"stop failed: " << r.error().message << std::endl;
193 auto stats = monitor->get_stats();
194 std::cout <<
"\nFinal monitoring stats:" << std::endl;
195 std::cout <<
" Total collections: " << stats.total_collections << std::endl;
204 std::cout <<
"\n=== Complete Integration Example ===\n" << std::endl;
207 auto logger = std::make_shared<mock_logger>();
208 auto monitor = std::make_shared<mock_monitoring>();
219 auto pool = std::make_shared<thread_pool>(
"IntegratedPool", context);
222 context.log(log_level_v2::info,
"Starting integrated thread pool example");
225 std::vector<std::unique_ptr<thread_worker>> workers;
226 for (
int i = 0; i < 4; ++i) {
227 workers.push_back(std::make_unique<thread_worker>(
true));
230 auto r = pool->enqueue_batch(std::move(workers));
232 std::cerr <<
"enqueue_batch failed: " << r.error().message << std::endl;
237 auto r = pool->start();
239 std::cerr <<
"start failed: " << r.error().message << std::endl;
245 std::cout <<
"Running workload with logging and monitoring..." << std::endl;
247 auto workload_start = std::chrono::steady_clock::now();
249 for (
int i = 0; i < 50; ++i) {
250 auto r = pool->enqueue(std::make_unique<callback_job>(
251 [i, &context]() -> kcenon::common::VoidResult {
253 context.log(log_level_v2::debug,
254 "Job " + std::to_string(i) +
" started");
257 auto work_time = 20 + (i % 30);
258 std::this_thread::sleep_for(std::chrono::milliseconds(work_time));
262 context.log(log_level_v2::warn,
263 "Job " + std::to_string(i) +
" took longer than expected");
266 return kcenon::common::ok();
270 std::cerr <<
"enqueue failed: " << r.error().message << std::endl;
275 for (
int i = 0; i < 5; ++i) {
276 std::this_thread::sleep_for(std::chrono::milliseconds(300));
278 auto snapshot_result = monitor->get_metrics();
279 if (snapshot_result.is_ok()) {
280 context.log(log_level_v2::info,
281 "Progress: " + std::to_string(snapshot_result.value().metrics.size()) +
282 " metrics recorded");
288 auto r = pool->stop();
290 std::cerr <<
"stop failed: " << r.error().message << std::endl;
294 auto workload_end = std::chrono::steady_clock::now();
295 auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(
296 workload_end - workload_start);
298 context.log(log_level_v2::info,
299 "Workload completed in " + std::to_string(duration.count()) +
" ms");
302 auto final_result = monitor->get_metrics();
303 if (final_result.is_ok()) {
304 const auto& final_snapshot = final_result.value();
305 std::cout <<
"\nFinal metrics:" << std::endl;
306 std::cout <<
" Total metrics collected: " << final_snapshot.metrics.size() << std::endl;
319 std::cout <<
"\n=== Dynamic Service Registration Example ===\n" << std::endl;
322 auto pool = std::make_shared<thread_pool>(
"DynamicPool");
324 std::vector<std::unique_ptr<thread_worker>> workers;
325 for (
int i = 0; i < 2; ++i) {
326 workers.push_back(std::make_unique<thread_worker>());
329 auto r = pool->enqueue_batch(std::move(workers));
331 std::cerr <<
"enqueue_batch failed: " << r.error().message << std::endl;
336 auto r = pool->start();
338 std::cerr <<
"start failed: " << r.error().message << std::endl;
344 std::cout <<
"Running without services..." << std::endl;
345 for (
int i = 0; i < 5; ++i) {
346 auto r = pool->enqueue(std::make_unique<callback_job>(
347 []() -> kcenon::common::VoidResult {
348 std::this_thread::sleep_for(std::chrono::milliseconds(50));
349 return kcenon::common::ok();
353 std::cerr <<
"enqueue failed: " << r.error().message << std::endl;
357 std::this_thread::sleep_for(std::chrono::milliseconds(300));
360 std::cout <<
"\nAdding logger service dynamically..." << std::endl;
361 auto logger = std::make_shared<mock_logger>();
369 for (
int i = 5; i < 10; ++i) {
370 auto r2 = pool->enqueue(std::make_unique<callback_job>(
371 [i, &new_context]() -> kcenon::common::VoidResult {
372 new_context.log(log_level_v2::info,
373 "Job " + std::to_string(i) +
" with dynamic logger");
374 std::this_thread::sleep_for(std::chrono::milliseconds(50));
375 return kcenon::common::ok();
379 std::cerr <<
"enqueue failed: " << r2.error().message << std::endl;
383 std::this_thread::sleep_for(std::chrono::milliseconds(600));
386 auto r = pool->stop();
388 std::cerr <<
"stop failed: " << r.error().message << std::endl;
Context object that provides access to optional services.
Context object providing access to optional thread system services.