本篇文档介绍 MiniOB 中的线程池模型。

简介

多线程是提高系统资源利用率的一种常用手段,也是我们学习软件开发进阶的必经之路。 MiniOB 实现了一个可扩展的线程模型,当前支持两种线程池模型:

  • 一个连接一个线程;
  • 一个线程池处理所有连接。

这种设计是模仿了MySQL/MariaDB的线程模型设计。

线程模型设计

命令行参数

当前MiniOB的线程池模型通过命令行接口指定使用哪种类型:

# 一个连接一个线程(默认)
observer -T=one-thread-per-connection
# 一个线程池处理所有连接
observer -T=java-thread-pool

ThreadHandler::create 会根据传入的名字创建对应的 ThreadHandler 对象。

线程池模型做什么

这个模型并不负责所有的任务,只处理客户端发来的请求。包括监听客户端是否有消息到达、处理SQL请求与返回应答、关闭连接等。

线程模型并不负责监听新的客户端连接,这是在主线程中做的事情,参考 NetServer::serve。当有新的连接到达时,会调用 ThreadHandler::new_connection,线程模型按照自己的模型设计来处理新来的连接。

一个连接一个线程

OneThreadPerConnectionThreadHandler 会为每个连接创建一个线程,这个线程负责监听这个连接是否有消息到达、处理SQL请求与返回应答、关闭连接等。

OneThreadPerConnectionThreadHandler

线程池模型

JavaThreadPoolThreadHandler 会创建一个线程池,线程池中一个线程负责监听所有连接是否有消息到达。如果有消息到达,就将这个连接对象放入线程池任务队列中,等待线程池中的线程来处理。在某个连接的任务处理完成之前,不会监听它的新消息。

这个线程池使用libevent实现消息监听,参考 JavaThreadPoolThreadHandler::start

这里解释一下为什么叫做JavaThreadPoolThreadHandler,因为这个线程池的设计是参考了Java的线程池设计,但是做了简化,参考 ThreadPoolExecutor

ThreadPoolExecutor 是一个简单的可伸缩线程池。当任务比当前空闲线程多的时候,就会扩容。当某些线程空闲时间比较久,就会自动退出。

JavaThreadPoolThreadHandler

参考