Go WaitGroup里面在嵌套WaitGroup

平时用到协程嵌套不多 想问下WaitGroup组内是否还可以在嵌套一层WaitGroup

我在本地跑测试发现是没有问题 都能执行到 …

func TestGoRoutine(t *testing.T) {
    wg := sync.WaitGroup{}
    limitNum := 3
    wg.Add(limitNum)
    for j := 0; j < limitNum; j++ {
        go func(index int) {
            defer wg.Done()
            testRoutine(index)
        }(j)
    }
    wg.Wait()
}

func testRoutine(index int) {
  wg2 := sync.WaitGroup{}
  limitNum2 := 3
  wg2.Add(limitNum2)
  for i := 0; i < limitNum2; i++ {
  go func(index2 int) {
  defer wg2.Done()
  fmt.Printf("测试上级Index[%d]Index2:[%d] \n", index, index2)
 }(i)
 }  wg2.Wait()
}

测试结果:

测试上级Index[2]Index2:[2] 
测试上级Index[2]Index2:[1] 
测试上级Index[1]Index2:[2] 
测试上级Index[1]Index2:[0] 
测试上级Index[1]Index2:[1] 
测试上级Index[2]Index2:[0] 
测试上级Index[0]Index2:[1] 
测试上级Index[0]Index2:[2] 
测试上级Index[0]Index2:[0] 
--- PASS: TestGoRoutine (0.00s)
PASS

进程完成,并显示退出代码 0

其实实现的目标是协程里嵌套协程。
需求背景是mysql的分页通过协程处理,每个协程底下还要在进行一次并发查询。
或者有更好的实现方式吗 ?

讨论数量: 3

没有问题,go协程是平行的,忽略上下级关系。两个函数可以看成独立的

1个月前 评论
flc1125

不影响,留意好 sync. WaitGroup 的作用范围就行了。

1周前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!