【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()
}
相关推荐
AI直播技术杂谈18 小时前
本周技术笔记:直播推流的心跳检测与断线重连逻辑
笔记
Aision_19 小时前
代码安全学习手记(二):SCA 软件成分分析原理与 OWASP Dependency-Check 集成实战
运维·人工智能·学习·安全·web安全·网络安全
是隼人20 小时前
buuctf-pwn bjdctf_2020_babystack2题解 整数溢出(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
骇客野人20 小时前
电商商城微服务架构设计方案(SpringCloud/Go+Vue3+MySQL+ES+RocketMQ)
spring cloud·微服务·golang
KhalilRuan20 小时前
UnityCsReference——笔记
java·开发语言·笔记
电子云与长程纠缠21 小时前
UE5 Lyra PocketWorld进行3D内容UI预览 - 上
开发语言·学习·3d·ue5·游戏引擎
shangwen12321 小时前
食品厂无尘车间装修施工工艺笔记:C型钢吊顶加固方案尚文净化
笔记
210Brian21 小时前
STM32学习笔记(六)EXTI外部中断(下)
笔记·stm32·学习
码农大叔的博客21 小时前
golang示例:for九九乘法表
开发语言·算法·golang
MartinYeung521 小时前
[论文学习]Latent Fusion Jailbreak: 融合有害与无害表征以诱导大语言模型产生不安全输出
学习·安全·语言模型