【go从零单排】Worker Pools工作池

🌈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 可以简化并发编程中的任务分发和结果收集。

💪无人扶我青云志,我自踏雪至山巅。

相关推荐
爱读源码的大都督1 分钟前
Claude Code源码分析(三):为什么系统提示词中需要有tools呢?
前端·人工智能·后端
爱勇宝6 分钟前
Claude Code 被曝暗藏“隐形检测”代码:封代理不是最可怕的,可怕的是你根本不知道它在干什么
前端·后端·程序员
ITOM运维行者26 分钟前
从零搭建企业级服务器监控体系:踩坑实录与架构设计
前端·后端
用户40993225021234 分钟前
Vue状态管理入门第四章:组合式store和SSR风险
前端·vue.js·后端
用户342323237631735 分钟前
SPI 通信与高速外设驱动详解
后端
魏祖潇1 小时前
SDD 完整指南——Spec 端打底、Story 端交付、留白区
人工智能·后端
feelmylife591 小时前
消息队列可靠投递与幂等消费 -- 从"消息丢了"到"消息别重复"的完整工程实践
后端
雪隐1 小时前
个人电脑玩AI-10让5060 Ti给你打工——部署 Odysseus:终于有个能打的"AI管家"了
人工智能·后端
copyer_xyf2 小时前
FastAPI 如何连接 MySQL
后端·python
IT_陈寒2 小时前
Vite打包时踩的坑:静态资源为啥突然404了?
前端·人工智能·后端