工作池模式 (Worker Pool Pattern)
工作池模式 (Worker Pool Pattern) 是一种并发模式,用于通过限制并发执行的任务数量来提高应用程序的性能和可伸缩性。该模式涉及创建一个工作池,其中包含固定数量的工作者(Worker),这些工作者从一个共享的队列中获取任务,并执行它们。当一个工作者完成任务时,它会返回工作池,等待分配新的任务。
下面是 Go 语言中实现工作池模式的示例代码:
package main
import (
"fmt"
"sync"
)
// Task 表示要执行的任务
type Task struct {
ID int
}
// worker 表示一个工作者,用于从任务队列中获取任务并执行它们
func worker(id int, taskQueue chan Task, wg *sync.WaitGroup) {
defer wg.Done()
for task := range taskQueue {
fmt.Printf("Worker %d 执行任务 %d\n", id, task.ID)
}
}
func main() {
// 创建一个有缓冲的通道,用于存储要执行的任务
taskQueue := make(chan Task, 10)
// 创建一个等待组,用于等待所有工作者完成任务
var wg sync.WaitGroup
// 创建一组工作者
for i := 1; i <= 3; i++ {
wg.Add(1)
go worker(i, taskQueue, &wg)
}
// 添加一些任务到任务队列中
for i := 1; i <= 10; i++ {
task := Task{ID: i}
taskQueue <- task
}
// 关闭任务队列,等待所有工作者完成任务
close(taskQueue)
wg.Wait()
}
在这个示例代码中,我们首先创建一个具有缓冲的通道,用于存储要执行的任务。然后,我们创建一组工作者,它们会从任务队列中获取任务并执行它们。接下来,我们将一些任务添加到任务队列中,并关闭任务队列,以便工作者知道不会有更多的任务。最后,我们使用等待组等待所有工作者完成任务。
在工作者函数中,我们使用 for-range
循环来迭代任务队列中的任务。这个循环会一直运行,直到任务队列被关闭为止。在循环中,我们使用 fmt
包打印出工作者的 ID 和任务的 ID,以模拟工作者执行任务的过程。
这就是一个简单的 Go 语言实现工作池模式的示例代码。通过使用工作池模式,我们可以有效地控制并发执行的任务数量,从而提高应用程序的性能和可伸缩性。
推荐文章: