栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

go开启多个子协程干活

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

go开启多个子协程干活

文章目录
  • 一 目标
  • 二 code示例
    • 1. 简单go知识介绍
    • 2. sync.WaitGroup
    • 3. 看code及输出,理解

一 目标

go启动多个协程,每个协程做一个任务,实现并行做任务。

二 code示例 1. 简单go知识介绍

go的并发通过goroutine来处理;
func(){}()是go里的匿名函数,{}后面的()是传参数的。如func(a int){…}(100),传了个参数值100;
go func(){}开启1个子协程;
for+ go func开启多个子协程;
go的sync.WaitGroup控制并发的流程;
go func()里+defer捕获子协程内部有发生的panic。因为主进程的defer无法捕获子协程中的panic异常,所有go func()中一般有defer()处理子协程内发生的panic。

2. sync.WaitGroup

是一个struct,有三个方法:
var wkCount sync.WaitGroup

  • wkCount.Add(delta int):增加需要等待的任务数
  • wkCount.Done():任务数减1。放在任务做完的时候,执行。
  • wkCount.Wait():会将程序阻塞,直到Done()将任务数降至0,既所有任务做完。只要有任务没做完,便锁住程序。
3. 看code及输出,理解
// Exception 异常处理
func Exception(funcName string) {
	if p := recover(); p != nil {
		fmt.Println("[msg: recover panic: %v] [err: %v]", funcName, p)
		debug.PrintStack()
	}
}

func testWaitGroup(workers int) { // 主进程
	defer Exception("test WaitGroup")

	var wkCount sync.WaitGroup

	// 增加需要等待的任务数
	wkCount.Add(workers)

	for i := 0; i < workers; i++ {
		go func() {
			// go func(goroutine方式):开启一个子协程   但主进程的defer无法捕获子协程中的panic异常,所有go func()中一般有defer()处理子协程内发生的panic
			// go func()+defer一般用在:多次远程调用,每一次新开一个协程去执行,无需等待结果即可循环下一次????
			// defer捕获子协程内发生的panic
			defer func() {
				// 任务数降1个 当捕获子协程异常时,说明1个子协程(process)已经执行结束了
				wkCount.Done()
				fmt.Println("333") // 3
				if p := recover(); p != nil {
					fmt.Println("[msg: recovered panic] [err: %v]", p)
					debug.PrintStack()
				}
				fmt.Println("444") // 4
			}()

			// 核心处理操作  子协程
			fmt.Println("222 process:", i+10) // 2
		}()

		fmt.Println("111") // 执行顺序:1
	}
	wkCount.Wait()          // 等待所有协程执行完毕 只要有任务在阻塞着,便锁住程序
	fmt.Println("wait 最后后") // 5
}

func main() {
	workers := 3
	testWaitGroup(workers)
}

启1个的输出:
111
222 process: 10
333
444
wait 最后后

启3个的输出(空行我自己添加的):
111
111
111

222 process: 13
333
444

222 process: 13
333
444

222 process: 13
333
444

wait 最后后
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/944085.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号