面试题答案
一键面试Worker Pool模式原理
Worker Pool模式是一种并发设计模式,它通过维护一个固定数量的工作者(worker)goroutine池,这些工作者从任务队列中取出任务并执行。这样可以有效控制并发度,避免创建过多的goroutine导致资源耗尽。任务队列作为缓冲区,暂存待处理的任务。工作者不断从队列中获取任务,执行完成后再获取新任务,直到任务队列为空或程序结束。
代码示例
package main
import (
"fmt"
)
// 定义任务结构体
type Task struct {
ID int
}
// 工作者函数,处理任务
func worker(id int, taskChan <-chan Task) {
for task := range taskChan {
fmt.Printf("Worker %d is processing task %d\n", id, task.ID)
}
}
func main() {
const workerCount = 3
const taskCount = 5
taskChan := make(chan Task)
// 创建工作者
for i := 1; i <= workerCount; i++ {
go worker(i, taskChan)
}
// 提交任务
for i := 1; i <= taskCount; i++ {
taskChan <- Task{ID: i}
}
// 关闭任务通道,告知工作者没有更多任务
close(taskChan)
// 等待所有任务完成,这里简单睡眠模拟,实际应用中可能需要更复杂的同步机制
select {}
}
在上述代码中:
- 定义了
Task
结构体表示任务。 worker
函数作为工作者,从taskChan
中接收任务并处理。- 在
main
函数中,创建了固定数量的工作者goroutine,并向任务通道taskChan
提交任务,最后关闭任务通道,防止工作者goroutine阻塞。