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

随心笔谈9个月前发布 admin
185 00
🌐 经济型:买域名、轻量云服务器、用途:游戏 网站等 《腾讯云》特点:特价机便宜 适合初学者用 点我优惠购买
🚀 拓展型:买域名、轻量云服务器、用途:游戏 网站等 《阿里云》特点:中档服务器便宜 域名备案事多 点我优惠购买
🛡️ 稳定型:买域名、轻量云服务器、用途:游戏 网站等 《西部数码》 特点:比上两家略贵但是稳定性超好事也少 点我优惠购买

文章摘要

这篇文章介绍了如何在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
}
}

© 版权声明

相关文章