文章摘要
这篇文章介绍了如何在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
}
}
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
}
}
© 版权声明
文章版权归作者所有,未经允许请勿转载。



