Skip to content
fasiondog edited this page Nov 22, 2025 · 1 revision

线程池监控

**本文档引用的文件** - [ThreadSafeQueue.h](file://hikyuu_cpp/hikyuu/utilities/thread/ThreadSafeQueue.h) - [MQThreadPool.h](file://hikyuu_cpp/hikyuu/utilities/thread/MQThreadPool.h) - [GlobalMQThreadPool.h](file://hikyuu_cpp/hikyuu/utilities/thread/GlobalMQThreadPool.h) - [WorkStealQueue.h](file://hikyuu_cpp/hikyuu/utilities/thread/WorkStealQueue.h) - [mylog.py](file://hikyuu/util/mylog.py) - [test_ThreadPool.cpp](file://hikyuu_cpp/unit_test/hikyuu/utilities/thread/test_ThreadPool.cpp) - [FuncWrapper.h](file://hikyuu_cpp/hikyuu/utilities/thread/FuncWrapper.h) - [InterruptFlag.h](file://hikyuu_cpp/hikyuu/utilities/thread/InterruptFlag.h)

目录

  1. 简介
  2. 线程池架构
  3. 监控指标实现
  4. 无锁监控机制
  5. 日志集成
  6. 使用示例
  7. 总结

简介

本文档详细介绍hikyuu框架中线程池的监控机制,包括如何监控线程池的运行状态、实现无锁监控以及与日志系统的集成。线程池是hikyuu框架中用于并行处理任务的核心组件,通过有效的监控可以确保系统的稳定性和性能。

线程池架构

hikyuu框架提供了多种线程池实现,主要包括MQThreadPool和GlobalMQThreadPool。这些线程池采用多队列架构,每个工作线程拥有独立的任务队列,从而减少线程间的竞争。

graph TB
subgraph "线程池核心组件"
ThreadPool[线程池]
TaskQueue[任务队列]
WorkerThread[工作线程]
end
ThreadPool --> TaskQueue
ThreadPool --> WorkerThread
TaskQueue --> |线程安全| WorkerThread
Loading

图源

  • MQThreadPool.h
  • ThreadSafeQueue.h

本节来源

  • MQThreadPool.h
  • GlobalMQThreadPool.h

监控指标实现

线程池提供了多种监控指标,用于实时了解其运行状态。这些指标包括工作线程数、剩余任务数和线程池状态等。

工作线程数监控

通过worker_num()方法可以获取线程池中工作线程的数量。该方法返回构造线程池时指定的线程数。

classDiagram
class MQThreadPool {
+size_t worker_num()
+size_t remain_task_count()
+bool done()
}
class GlobalMQThreadPool {
+size_t worker_num()
+size_t remain_task_count()
+bool done()
}
MQThreadPool <|-- GlobalMQThreadPool
Loading

图源

  • MQThreadPool.h
  • GlobalMQThreadPool.h

剩余任务数监控

remain_task_count()方法用于获取线程池中所有任务队列的剩余任务总数。该方法遍历所有工作线程的任务队列,累加各队列的大小。

flowchart TD
Start([开始]) --> GetQueueCount["获取每个队列的任务数"]
GetQueueCount --> SumTotal["累加所有队列的任务数"]
SumTotal --> ReturnResult["返回总任务数"]
ReturnResult --> End([结束])
Loading

图源

  • MQThreadPool.h
  • GlobalMQThreadPool.h

线程池状态监控

done()方法用于检查线程池是否已完成或已停止。该方法返回一个布尔值,表示线程池的运行状态。

本节来源

  • MQThreadPool.h
  • GlobalMQThreadPool.h

无锁监控机制

hikyuu线程池采用线程安全的队列和原子操作来实现无锁监控机制,确保在高并发环境下的性能和稳定性。

线程安全队列

ThreadSafeQueue是实现无锁监控的基础组件,它使用互斥锁保护队列操作,确保多线程环境下的数据一致性。

classDiagram
class ThreadSafeQueue {
+void push(T&& item)
+void wait_and_pop(T& value)
+bool try_pop(T& value)
+bool empty()
+size_t size()
}
class Mutex {
+lock()
+unlock()
}
ThreadSafeQueue --> Mutex : "使用"
Loading

图源

  • ThreadSafeQueue.h

原子操作

线程池使用std::atomic_bool来实现线程间的通信和状态同步,避免了传统锁机制带来的性能开销。

sequenceDiagram
participant Thread1 as "工作线程1"
participant Thread2 as "工作线程2"
participant Main as "主线程"
Main->>Thread1 : m_done.store(true)
Thread1->>Thread1 : 检查m_done.load()
Thread1->>Main : 退出执行
Main->>Thread2 : m_done.store(true)
Thread2->>Thread2 : 检查m_done.load()
Thread2->>Main : 退出执行
Loading

图源

  • MQThreadPool.h
  • GlobalMQThreadPool.h

本节来源

  • ThreadSafeQueue.h
  • InterruptFlag.h

日志集成

hikyuu框架通过util/mylog.py模块提供日志功能,可以将线程池的运行信息输出到日志文件,便于性能分析和故障排查。

日志配置

日志系统使用Python的logging模块,配置了文件处理器和格式化器,将日志输出到用户目录下的hikyuu_py.log文件。

classDiagram
class Logger {
+debug(msg)
+info(msg)
+warning(msg)
+error(msg)
+critical(msg)
}
class FileHandler {
+RotatingFileHandler
+maxBytes=10240
+backupCount=3
}
class Formatter {
+FORMAT = '%(asctime)-15s [%(levelname)s] %(message)s [%(name)s : : %(funcName)s]'
}
Logger --> FileHandler
Logger --> Formatter
Loading

图源

  • mylog.py

日志输出

线程池可以通过日志系统输出运行信息,包括任务提交、执行和完成等关键事件。

flowchart TD
SubmitTask["提交任务"] --> LogSubmit["记录提交日志"]
LogSubmit --> ExecuteTask["执行任务"]
ExecuteTask --> LogExecute["记录执行日志"]
LogExecute --> CompleteTask["任务完成"]
CompleteTask --> LogComplete["记录完成日志"]
Loading

本节来源

  • mylog.py
  • test_ThreadPool.cpp

使用示例

以下是一个使用MQThreadPool的示例,展示了如何创建线程池、提交任务和监控其状态。

sequenceDiagram
participant Main as "主线程"
participant ThreadPool as "线程池"
participant Worker as "工作线程"
Main->>ThreadPool : 创建线程池(8线程)
Main->>ThreadPool : 提交任务
ThreadPool->>Worker : 分配任务
Worker->>Worker : 执行任务
Worker->>Main : 返回结果
Main->>ThreadPool : join()
ThreadPool->>Main : 所有任务完成
Loading

本节来源

  • test_ThreadPool.cpp
  • MQThreadPool.h

总结

hikyuu框架的线程池监控机制通过线程安全的队列和原子操作实现了高效的无锁监控。监控指标包括工作线程数、剩余任务数和线程池状态等,这些指标可以帮助开发者了解线程池的运行状况。通过与util/mylog.py日志系统的集成,可以将线程池的运行信息输出到日志文件,便于性能分析和故障排查。这种设计既保证了监控的准确性,又避免了传统锁机制带来的性能开销。

Clone this wiki locally