文章目录
任务池用来管理并发任务,没有任务池面临的问题:并发任务来一个开一个goroutine
- 慢任务长期占据goroutine, 快任务部分阻塞,任务处理效率低
- goroutine数量没有限制,持续上涨,有系统资源耗尽的风险
任务池核心特性
- 控制并发数量、避免资源耗尽
- 复用资源
- 提供优雅退出、超时控制
- 动态调度
接口设计
type TaskPool interface {
// Submit 提交任务 taskPool创建和运行中允许提交任务
Submit(ctx context.Context, task task.Task) error
// Start 启动taskPool
Start() error
// Shutdown 优雅退出 等待任务处理完成后结束
Shutdown() (<-chan struct{}, error)
// ShutdownNow 立即退出 立即退出后,返回未处理任务
ShutdownNow() ([]task.Task, error)
// States 定时快照
States(ctx context.Context, interval time.Duration) (<-chan State, error)
}
task pool 状态流转
goroutine调度设计

任务设计
task pool中task介绍
源码
gitee: https://gitee.com/luyue_zhang/channel/tree/master/task_pool
测试
测试结构

测试演示
稳定测试
不稳定测试,受任务运行速度影响
任务池使用注意事项
合理设置任务池缓冲容量
无缓冲、缓冲小了会阻塞任务提交;缓冲过大会导致资源浪费
任务优先级
快任务、慢任务分开放在两个任务池中配置、处理
相关资料
https://github.com/flycash/ekit/blob/dev/pool/task_pool.go
Go语言高性能工作池(Worker Pool)设计模式:从原理到实践 // 这篇文章我喜欢他的场景示例和数据对比