workerpool的实现原理
# 2. workerpool 的实现原理
采用完全基于 channel+select 的实现方案,不使用其他数据结构,也不使用 sync 包提供的各种同步结构,比如 Mutex、RWMutex,以及 Cond 等。
workerpool 的实现主要分为三个部分:
- pool 的创建与销毁;
- pool 中 worker(Goroutine)的管理;
- task 的提交与调度。
pool 对 worker 的管理:
- capacity 是 pool 的一个属性,代表整个 pool 中 worker 的最大容量。使用一个带缓冲的 channel:active,作为 worker 的“计数器”,这种 channel 使用模式就是计数信号量。
- 当 active channel 可写时,就创建一个 worker,用于处理用户通过 Schedule 函数提交的待处理的请求。
- 当 active channel 满了的时候,pool 就会停止 worker 的创建,直到某个 worker 因故退出,active channel 又空出一个位置时,pool 才会创建新的 worker 填补那个空位。
- 这张图里,把用户要提交给 workerpool 执行的请求抽象为一个 Task。Task 的提交与调度也很简单:Task 通过 Schedule 函数提交到一个 task channel 中,已经创建的 worker 将从这个 task channel 中读取 task 并执行。
上次更新: 2022/06/12, 15:48:09