草庐IT

waitgroup

全部标签

go - 当所有 goroutines 完成时退出程序

我有两个go例程函数,一个创建数据,一个将数据添加到数据库中。当我完成创建数据时,我想完成添加数据,但我不知道我要调用该函数多少次。for{select{caseccreateData()创建数据并将其发送到dataChan并根据一些变量最终将data设置为false并通过一遍又一遍地返回并停止创建更多数据来使程序保持打开状态,但我觉得应该有一种更简洁的方法让我在所有addData()goroutines完成。我见过人们为此使用channel,但我不知道我要调用该函数多少次。更新:工作代码varwgsync.WaitGroupfor{select{casec

multithreading - 从 goroutine func 发出修改映射

scores:=make(map[string]int)percentage:=make(map[string]float64)total:=0fori,ans:=rangeanswers{answers[i]=strings.ToLower(ans)}wg:=sync.WaitGroup{}gofunc(){wg.Add(1)body,_:=google(question)for_,ans:=rangeanswers{count:=strings.Count(body,ans)total+=countscores[ans]+=5//这是一段代码,我的问题是,我无法修改分数,我试过使用

multithreading - 从 goroutine func 发出修改映射

scores:=make(map[string]int)percentage:=make(map[string]float64)total:=0fori,ans:=rangeanswers{answers[i]=strings.ToLower(ans)}wg:=sync.WaitGroup{}gofunc(){wg.Add(1)body,_:=google(question)for_,ans:=rangeanswers{count:=strings.Count(body,ans)total+=countscores[ans]+=5//这是一段代码,我的问题是,我无法修改分数,我试过使用

go - 使用 WaitGroup 测试竞争条件时的意外行为

我的任务是在Go中模拟竞争条件。但是,我遇到了一个我无法解释的案例。下面的代码片段packagemainimport("fmt""sync")varvalue,totalOps,totalIncOps,totalDecOpsintfuncmain(){fmt.Println("Totalvalue:",simulateRacing(10000))fmt.Print("Totaliterations:",totalOps)fmt.Print("ofit,increments:",totalIncOps)fmt.Print(",decrements:",totalDecOps)}//Fun

go - 使用 WaitGroup 测试竞争条件时的意外行为

我的任务是在Go中模拟竞争条件。但是,我遇到了一个我无法解释的案例。下面的代码片段packagemainimport("fmt""sync")varvalue,totalOps,totalIncOps,totalDecOpsintfuncmain(){fmt.Println("Totalvalue:",simulateRacing(10000))fmt.Print("Totaliterations:",totalOps)fmt.Print("ofit,increments:",totalIncOps)fmt.Print(",decrements:",totalDecOps)}//Fun

go - `sync.WaitGroup` 的方法集是什么?

下面有这个简单的程序packagemainimport("fmt""sync""time")varwgsync.WaitGroupfuncmain(){wg.Add(1)gofunc(){fmt.Println("starting...")time.Sleep(1*time.Second)fmt.Println("done....")wg.Done()}()wg.Wait()}请注意,我使用varwgsync.WaitGroup作为值,而不是指针。但是pageforthesyncpackage指定Add、Done和Wait函数采用*sync.WaitGroup。为什么/这是如何工作的?

go - `sync.WaitGroup` 的方法集是什么?

下面有这个简单的程序packagemainimport("fmt""sync""time")varwgsync.WaitGroupfuncmain(){wg.Add(1)gofunc(){fmt.Println("starting...")time.Sleep(1*time.Second)fmt.Println("done....")wg.Done()}()wg.Wait()}请注意,我使用varwgsync.WaitGroup作为值,而不是指针。但是pageforthesyncpackage指定Add、Done和Wait函数采用*sync.WaitGroup。为什么/这是如何工作的?

go - sync.WaitGroup 没有像我预期的那样表现,我在这里缺少什么?

鉴于以下情况:packagemainimport("fmt""sync")funcmain(){n:=100varwgsync.WaitGroupwg.Add(n)x:=0fori:=0;i我希望x在最后打印时始终达到100,但它有时会打印到95。我在这里缺少什么? 最佳答案 x上有一场比赛。一种解决方法是使用互斥体保护x:varmusync.Mutexvarwgsync.WaitGroupwg.Add(n)x:=0fori:=0;iplaygroundexample我建议运行racedetector每当有人在一个包含多个gorou

go - sync.WaitGroup 没有像我预期的那样表现,我在这里缺少什么?

鉴于以下情况:packagemainimport("fmt""sync")funcmain(){n:=100varwgsync.WaitGroupwg.Add(n)x:=0fori:=0;i我希望x在最后打印时始终达到100,但它有时会打印到95。我在这里缺少什么? 最佳答案 x上有一场比赛。一种解决方法是使用互斥体保护x:varmusync.Mutexvarwgsync.WaitGroupwg.Add(n)x:=0fori:=0;iplaygroundexample我建议运行racedetector每当有人在一个包含多个gorou

go - 等待 sync.Waitgroup 延迟

当从下面的goroutine在channel上发送时,我有以下代码进入死锁:packagemainimport("fmt""sync")funcmain(){fora:=rangegetCh(10){fmt.Println("Got:",a)}}funcgetCh(nint)我知道在defer中使用wg.Wait()是合法的。但是我一直没能在以channel作为返回值的函数中找到用途。 最佳答案 我认为您犯的错误是您认为deferred函数也将异步运行。但事实并非如此,因此getCh()将阻塞在其延迟部分,等待WaitGroup。但