在 Go语言 的世界里,并发是其核心特性之一。通过 goroutine 和 channel,我们可以轻松构建高性能的并发程序。而 worker pool(工作池) 是一种非常经典且实用的并发设计模式,特别适合处理大量相似任务的场景,比如批量处理请求、日志分析、图像处理等。

Worker Pool(工作池)是一种限制并发数量的机制。它预先创建固定数量的“工人”(goroutine),这些工人从一个共享的任务队列(channel)中领取任务并执行。这样既能利用多核 CPU 提升效率,又能避免因无限制创建 goroutine 而导致系统资源耗尽。
想象一下:你有一家快递分拣中心,有 10 个分拣员(workers),所有包裹(jobs)都放在传送带上(job channel)。每个分拣员不断从传送带上取包裹进行分拣(处理任务)。这就是 worker pool 的基本思想。
下面我们用 Go语言 实现一个基础的 worker pool。我们将创建 3 个 worker,处理 10 个任务。
package mainimport ( "fmt" "sync" "time")// Job 表示一个任务type Job struct { ID int}// Result 表示任务执行结果type Result struct { JobID int Output string Err error}func main() { const numJobs = 10 const numWorkers = 3 // 创建任务通道和结果通道 jobs := make(chan Job, numJobs) results := make(chan Result, numJobs) // 启动 workers var wg sync.WaitGroup for i := 0; i < numWorkers; i++ { wg.Add(1) go worker(jobs, results, &wg) } // 发送任务 go func() { defer close(jobs) for j := 1; j <= numJobs; j++ { jobs <- Job{ID: j} } }() // 关闭 results 通道(在所有 worker 完成后) go func() { wg.Wait() close(results) }() // 收集结果 for result := range results { fmt.Printf("任务 %d 完成,结果: %s\n", result.JobID, result.Output) } fmt.Println("所有任务已完成!")}// worker 从 jobs 通道接收任务,处理后发送到 resultsfunc worker(jobs <-chan Job, results chan<- Result, wg *sync.WaitGroup) { defer wg.Done() for job := range jobs { // 模拟耗时操作 time.Sleep(500 * time.Millisecond) output := fmt.Sprintf("处理完成 - Worker %d 处理了任务 %d", getGoroutineID(), job.ID) results <- Result{JobID: job.ID, Output: output} }}// 简化版:获取当前 goroutine ID(仅用于演示,实际不推荐使用)func getGoroutineID() int { return 0 // 实际项目中可省略或用其他方式标识}上述代码是一个基础版本。在真实项目中,你可以考虑以下优化:
通过本文,我们学习了 并发编程 中的 worker pool 模式,理解了它在 Go语言 中的实现原理和应用场景。合理使用 工作池 可以让你的程序既高效又稳定。
记住:并发不是越多越好,而是“恰到好处”。掌握 worker pool,你就掌握了 Go 并发编程的一把利器!
关键词回顾:Go语言、并发编程、worker pool、工作池。
本文由主机测评网于2025-12-03发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025122458.html