golang协程池之gopool

简介

goroutine协程,是golang的轻量级线程。协程池利用池化技术,复用对象,减少了内存分配的频率以及协程创建开销。

gopool是字节跳动开源节流的gopkg包中协程池的一个实现。

gopool

github.com/bytedance/g...

gopool是字节官方开源的gopkg库提供的协程池实现

demo try

go 复制代码
gopool.Go(func(){}
    // do your job
)

一探究竟

Task

task是链表结构,记录了待执行任务的信息

go 复制代码
type task struct {
	ctx context.Context
	f   func()

	next *task
}
Worker

worker关联了协程池的实例

Pool

Pool定义了协程池的接口

pool是协程池的实现,包含了task的链表结构。

pool通过workerpool和taskpool来创建worker和task实例

核心逻辑

新增执行任务task时,通过taskpool创建task对象。视需创建worker,执行worker的run方法

css 复制代码
    t := taskPool.Get().(*task)
    // ...
    if () {
        p.incWorkerCount()
        w := workerPool.Get().(*worker)
        w.pool = p
        w.run()
    }

worker执行时,会获取pool锁,从pool中取出待执行任务,执行任务

scss 复制代码
go func() {
		for {
			var t *task
			w.pool.taskLock.Lock()
            // get task
            w.pool.taskLock.Unlock()
            // ...
            t.f()
        }
}
相关配置

pool支持传入ScaleThreshold,当等待任务执行数超过此配置时,创建新的worker

默认实现

defaultPool是pool的默认实现,支持配置容量Cap、panicHandler等

go 复制代码
func SetCap(cap int32) {
	defaultPool.SetCap(cap)
}

func SetPanicHandler(f func(context.Context, interface{})) {
	defaultPool.SetPanicHandler(f)
}

总结

pool是gopool的一个逻辑协程池,管理着待执行的task,可以动态创建worker来多协程并发处理task对象。同时,通过sync.pool来优化了task和worker对象的创建。

相关推荐
1001101_QIA1 小时前
从 CPU 到 GPU:高速缓存、指令并行与 CUDA 执行原理入门
java·后端·spring
2501_928996222 小时前
信创备份一体机性能焦虑根源与中科热备国产CPU平台实测拆解
后端·数据安全·测试
程序员清风2 小时前
聊聊怎么缓解找工作的焦虑感?
java·后端·面试
不一样的少年_2 小时前
明明做了很多事,为什么简历看起来还是没含金量?
前端·后端·招聘
newerp2 小时前
Golang 函数调用的瞬间:栈帧、拷贝栈与逃逸分析
后端·程序员·go
会编程的吕洞宾2 小时前
LangChain4j RAG 分块策略实战:检索质量提升 80% 的 Chunking 调优全解
java·人工智能·后端
newerp2 小时前
Golang 网络轮询器 netpoll:把阻塞 IO 变成事件通知
后端·程序员·go
万物智能2 小时前
HDMI 输出—【万物智能之开源鸿蒙OpenHarmony系统实战开发系列教程】
后端·架构
Cache技术分享3 小时前
516. Java 方法句柄 - 转换(进阶篇·下)
前端·后端
妙码生花3 小时前
全网 8k star 的 BuildAdmin 正式发布 Golang 版本,这次我们在CRUD赛道杀死了比赛。
前端·后端·ai编程