1 回答
TA贡献1816条经验 获得超4个赞
WaitGroup实现基于内部计数器,该计数器由 和 方法更改。在计数器归零之前,该方法不会返回。也可以重复使用,但在文档中描述的某些条件下:AddDoneWaitWaitGroup
// If a WaitGroup is reused to wait for several independent sets of events,
// new Add calls must happen after all previous Wait calls have returned.
尽管您的代码没有重用,但它能够多次将计数器清零。当在给定时间没有处理任何任务时,就会发生这种情况,这在并发代码中是完全可能的。由于您的代码在调用之前不会等待返回,因此您会收到争用条件错误。wgWaitGroupWaitAdd
正如每个人在评论中建议的那样,您应该放弃跟踪任务的想法,转而控制正在运行的戈鲁丁。附加代码建议。WaitGroup
func Test(t *testing.T) {
var wg sync.WaitGroup
queuedTaskC := make(chan func(), 10)
for i := 0; i < 5; i++ {
wID := i + 1
wg.Add(1)
go func(workerID int) {
defer wg.Done()
for task := range queuedTaskC {
task()
}
}(wID)
}
for i := 0; i < 10; i++ {
queuedTaskC <- func() {
fmt.Println("executing task...")
}
}
close(queuedTaskC)
wg.Wait()
fmt.Println(len(queuedTaskC))
}
- 1 回答
- 0 关注
- 73 浏览
添加回答
举报