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
相关产品推荐
相关产品推荐

