【Go语言入门学习笔记】Part18.工作池与WaitGroup(也即协程池)

一、前言

两个功能相似的多个同类协程使用同类资源时候需要用到的协程池,满足并发工作需求。

二、学习代码

工作池:用result通道来收集完成情况

Go 复制代码
package main

import (
	"fmt"
	"time"
)

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
	}
}
func main() {
	const numJobs = 5
	jobs := make(chan int, numJobs)
	results := make(chan int, numJobs)
	for w := 1; w <= 3; w++ {
		go worker(w, jobs, results)
	}
	for j := 1; j <= numJobs; j++ {
		jobs <- j
	}
	close(jobs)
	for a := 1; a <= numJobs; a++ { //用循环模拟等待全部工人完成工作
		<-results
	}

}

WaitGroup:用特殊的WaitGroup变量来对协程进行处理。

Go 复制代码
package main

import (
	"fmt"
	"sync"
	"time"
)

func worker(id int, jobs <-chan int, wg *sync.WaitGroup) {
	defer wg.Done()
	for j := range jobs {
		fmt.Println("worker", id, "started  job", j)
		time.Sleep(time.Second)
		fmt.Println("worker", id, "finished job", j)
	}
	//wg.Done()
}
func main() {
	const numJobs = 5
	const numWorkers = 3
	var wg sync.WaitGroup
	wg.Add(numWorkers)
	jobs := make(chan int, numJobs)
	for w := 1; w <= numWorkers; w++ {
		go worker(w, jobs, &wg)
	}
	for j := 1; j <= numJobs; j++ {
		jobs <- j
	}
	close(jobs)
	wg.Wait()
}
相关推荐
想做小南娘,发现自己是女生喵2 小时前
第二周学习文档 Linux C 文件操作
linux·c语言·学习
乔旭伟2 小时前
Linux 服务器环境搭建实战笔记:最小化安装、Docker Compose 编排与上线检查全流程
linux·服务器·笔记
潜心一志2 小时前
图像预处理—— 图像的变换与校正(理论)
学习·计算机视觉
nmjkhome2 小时前
26 疲劳的几个重要概念(第51课)-solid works simulation
学习
深圳老胡2 小时前
RTX 与其他 RTOS 操作系统的差异及优缺点分析
笔记·stm32·单片机·代码规范
程序猿乐锅2 小时前
【从0-1学习Python | 第六篇】 Python 函数:定义、参数与返回值
开发语言·python·学习
燕落南枝2 小时前
HTML 学习:input 单选、复选与文件域详解
服务器·学习·html
银河技术3 小时前
从脚本到 Operator:用 Go 构建可靠的微服务自动扩缩容控制器
开发语言·微服务·golang
优选资源分享12 小时前
PicGo v3.0.3 新版 | 开源免费图床工具
javascript·笔记·electron
星恒随风13 小时前
Linux线程概念详解:从分页存储、页表、MMU与TLB,深入理解线程和进程的区别与联系
linux·运维·笔记·学习·状态模式