golang里可以通过关键字go
很简单的开启一个协程,但是如果开启协程的速度超过回收的速度,就会导致协程泄露。本文就介绍如何通过设计一个安全的协程池来避免出现协程泄露的问题。
协程池
一个包含多个工作协程,且能同时支持并行执行任务的数据结构
实现
协程池分两种类型,一种是worker数量固定的协程池,一种是worker数量可自动伸缩的协程池
类型 | 协程数 | 特点 | 适用场景 |
---|---|---|---|
FixedGoroutinePool | 固定 | 不需要重复创建和回收协程,性能好。如果协程数分配过多,会导致资源浪费 | 适用于并发较低的应用场景,如定时任务 |
ScalableGoroutinePool | 不固定 | 保持最低协程数量,协程数会随着并发增加而自动伸缩,在性能和资源之间有所平衡 | 适用于并发较高的场景,如HTTP异步请求 |
接口定义:
1 | type GoroutinePool interface { |
以下是具体实现:
固定协程池
实现一个固定数量的协程池
1 |
|
浮动协程池
支持自动伸缩的协程池
1 |
|
- 本文作者: Hongker
- 本文链接: https://hongker.github.io/2022/12/01/golang-worker-pool/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!