🌈Don't worry , just coding!
内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。
📗概念
在 Go 中,Worker Pool(工作池)是一种设计模式,用于管理和限制并发执行的任务数量。通过创建一组 worker goroutines 来处理任务,从而提高资源利用率并避免过载。
💻代码
go
package main
import (
"fmt"
"time"
)
// 创建函数worker,输入一个int,一个只读的 jobs 通道和一个只写的 results 通道。
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "started job", j)
time.Sleep(time.Second) // 模拟工作
fmt.Println("worker", id, "finished job", j)
results <- j * 2 // 将结果发送到 results 通道
}
}
func main() {
const numJobs = 5
//创建 jobs 和 results 通道,缓冲区大小为 numJobs。
jobs := make(chan int, numJobs) // 创建一个通道用于传递任务
results := make(chan int, numJobs) // 创建一个通道用于传递结果
for w := 1; w <= 3; w++ { // 启动 3 个 worker goroutine
go worker(w, jobs, results)
}
for j := 1; j <= numJobs; j++ { // 发送任务到 jobs 通道
jobs <- j
}
close(jobs) // 关闭 jobs 通道,表示没有更多的任务
for a := 1; a <= numJobs; a++ { // 从 results 通道接收结果
//使用循环从 results 通道接收结果,确保所有的结果都被处理
<-results
}
}
//输出
//worker 3 started job 1
//worker 1 started job 2
//worker 2 started job 3
//worker 2 finished job 3
//worker 2 started job 4
//worker 1 finished job 2
//worker 1 started job 5
//worker 3 finished job 1
//worker 1 finished job 5
//worker 2 finished job 4
🔍理解
- Worker:一个 goroutine,负责从任务队列中获取任务并执行。
- 任务队列:一个通道,用于存放待处理的任务。
- 结果通道:一个通道,用于存放 worker 执行完成后的结果。
💡 总结
- Worker Pool 是一种有效的并发控制模式,适用于需要处理大量任务的场景
- 通过设置 worker 数量,可以有效管理资源,避免系统过载。
- 使用通道和 WaitGroup 可以简化并发编程中的任务分发和结果收集。
💪无人扶我青云志,我自踏雪至山巅。