Content

Golang协程池的实现与应用(go语言协程池)太疯狂了

文章摘要

这篇文章介绍了如何在Go语言中实现一个协程池(poolling)的结构。协程池通过使用两个通道(EntryChannel和JobsChannel)来管理外部任务和内部任务的队列。池的大小由WorkerNum参数决定。协程池通过NewPool函数创建,worker函数负责处理内部任务,运行时会循环获取并执行这些任务。此外,run函数会启动多个工人,将外部任务通过JobsChannel传递进去,从而实现多线程的负载均衡。整体结构简洁,展示了如何通过Go语言的通道机制实现高效的协程管理。

// 定义一个协程池 type Pool struct { // 对外的Task入口 EntryChannel chan *Task // 对内的Task队列 JobsChannel chan *Task // 协程池的最大work数量 WorkerNum int } // NewPool 创建Pool的函数 func NewPool(cap int) *Pool{ return &Pool{ EntryChannel: make(chan *Task), JobsChannel: make(chan *Task), WorkerNum: cap, } } // 协程池创建一个Worker func (p *Pool)worker(workID int){ for task:=range p.JobsChannel{ task.Execute() //取到任务就执行 fmt.Println(“worker_id 为”,workID) } } // 让协程池开始真正的工作 func (p *Pool)run() { // 根据创建协程池的大小来创建协程工作 for i :=0; i < p.WorkerNum; i++ { go p.worker(i+1) } // 不断遍历外部的任务然后丢入到内部的队列去运行 for task :=range p.EntryChannel { p.JobsChannel<-task } }