福田网站建设推广,网络投放广告有哪些平台,如何跟客户介绍网站建设和推广,东莞易进网络专业网站建设 网站常见模式之四#xff1a;工作池/协程池模式 定义
顾名思义#xff0c;就是有固定数量的工人#xff08;协程#xff09;#xff0c;去执行批量的任务
使用场景 适用于需要限制并发执行任务数量的情况 创建一个固定大小的 goroutine 池#xff0c;将任务分发给池中的 g… 常见模式之四工作池/协程池模式 定义
顾名思义就是有固定数量的工人协程去执行批量的任务
使用场景 适用于需要限制并发执行任务数量的情况 创建一个固定大小的 goroutine 池将任务分发给池中的 goroutine 并等待它们完成使用带缓冲的通道来接收任务以避免阻塞主线程
示例
有生产需求建议使用大佬写的 ants库 以下是模拟协程池的简单示例
假设我们有固定数量2个工人执行批量4个任务 package mainimport (fmtsync
)type Task struct {TaskFunc func() interface{}
}type WorkerPool struct {Size intWg *sync.WaitGroupTasks chan TaskResults chan Result
}type Result struct {ID intRes interface{}
}func NewWorkerPool(workerNum, taskBufSize int) *WorkerPool {return WorkerPool{Size: workerNum,Wg: sync.WaitGroup{},Tasks: make(chan Task, taskBufSize),Results: make(chan Result, taskBufSize),}
}func (w *WorkerPool) AddTask(task Task) {w.Tasks - task
}func (w *WorkerPool) Run() {for i : 1; i w.Size; i {w.Wg.Add(1)go func(id int) {defer w.Wg.Done()w.Work(id, w.Tasks, w.Results)}(i)}
}func (w *WorkerPool) Work(Id int, tasks chan Task, results chan Result) {for task : range tasks {results - Result{ID: Id,Res: task.TaskFunc(),}}
}func main() {pool : NewWorkerPool(3, 10)pool.Run()pool.AddTask(Task{TaskFunc: func() interface{} {return 2 * 3}})pool.AddTask(Task{TaskFunc: func() interface{} {return 4 * 5}})pool.AddTask(Task{TaskFunc: func() interface{} {return 6 * 7}})pool.AddTask(Task{TaskFunc: func() interface{} {return 8 * 9}})close(pool.Tasks)go func() {pool.Wg.Wait()close(pool.Results)}()for v : range pool.Results {fmt.Println(v.ID, v.Res)}
}