You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言sync.WaitGroup使用问题:如何让请求仅等待自身所属组执行完成

问题原因

你当前代码的核心问题是所有任务共用了同一个sync.WaitGroup实例,当ID为0的任务调用wg.Wait()时,会等待所有已经执行wg.Add的任务完成wg.Done(),自然会被ID为1的任务阻塞,无法按预期线性执行。

解决方法

按独立任务组拆分sync.WaitGroup,每个任务批次单独创建专属的WaitGroup,仅管理当前批次的任务生命周期即可,修正后的代码如下:

package main

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

type Task struct {
	ID    int
	Name  string
	Sleep time.Duration
}

func main() {
	// 对应2次ID=0的任务批次
	for batchCount := 0; batchCount < 2; batchCount++ {
		// 每个ID=0的任务单独用专属WaitGroup管理
		var wg0 sync.WaitGroup
		wg0.Add(1)
		go func() {
			defer wg0.Done()
			task := Task{ID: 0, Name: "Test #1", Sleep: 5 * time.Nanosecond}
			time.Sleep(task.Sleep)
			fmt.Printf("ID: %d, Name: %s, Sleep: %v\n", task.ID, task.Name, task.Sleep)
		}()
		// 仅等待当前ID=0的任务完成,再执行后续ID=1的任务
		wg0.Wait()

		// 每个批次的ID=1任务单独用专属WaitGroup管理
		var wg1 sync.WaitGroup
		for i := 0; i < 5; i++ {
			wg1.Add(1)
			go func() {
				defer wg1.Done()
				task := Task{ID: 1, Name: "Test #2", Sleep: 1 * time.Nanosecond}
				time.Sleep(task.Sleep)
				fmt.Printf("ID: %d, Name: %s, Sleep: %v\n", task.ID, task.Name, task.Sleep)
			}()
		}
		wg1.Wait()
	}
}

运行上述代码即可得到你期望的输出结果:ID为0的任务无需等待其他批次的ID为1的任务,完成后直接触发当前批次的ID为1的任务执行,完全符合线性执行的要求。


内容的提问来源于stack exchange,提问作者paymex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 03:09:03