【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()
}
相关推荐
摇滚侠8 小时前
《SpringBoot 3:入门与应用实战》第 12 章 JDBC 与事务 使用 JdbcTemplate 阅读笔记 31
android·spring boot·笔记
是隼人8 小时前
buuctf-pwn mrctf2020_easy_equation(64位fmt)题解(学习过程持续更新)
c语言·学习·安全·pwn入门·ctf入门
金字塔頂の蝸牛8 小时前
商务日语口语全手册(一)
笔记·日语·语言·外语
王的宝库9 小时前
GO常用标准库包
开发语言·后端·golang
从零开始的嵌入式之旅9 小时前
day36
linux·c语言·经验分享·笔记·嵌入式硬件
吴声子夜歌9 小时前
Linux命令——查找文件
linux·运维·学习
我命由我123459 小时前
Windows 操作系统 - 启用 D 盘虚拟内存
java·运维·服务器·windows·学习·java-ee·运维开发
平头哥技术团队9 小时前
Day 13 | 调 line-height 和 margin:三处间距让名片页脱离模板感
开发语言·前端·javascript·学习·html5
具身AGI9 小时前
第一视角数据从哪来,物理AI 人类学习路线 的入口
人工智能·深度学习·学习
平头哥AI9 小时前
Day 13 | 一个函数回两个值:Go 的 error 是从哪冒出来的
开发语言·后端·golang