go 任务池


任务池用来管理并发任务,没有任务池面临的问题:并发任务来一个开一个goroutine

  1. 慢任务长期占据goroutine, 快任务部分阻塞,任务处理效率低
  2. goroutine数量没有限制,持续上涨,有系统资源耗尽的风险

任务池核心特性

  1. 控制并发数量、避免资源耗尽
  2. 复用资源
  3. 提供优雅退出、超时控制
  4. 动态调度

接口设计

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)设计模式:从原理到实践 // 这篇文章我喜欢他的场景示例和数据对比

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值