猿问

如何确保 goroutine 在退出前完全运行

我有一个调用 go 例程的函数,该例程调用其中的其他函数。然而,那些go例程在完全完成之前就已经退出了。我如何确保函数 (migrateUserHelper) 中的所有底层代码在退出之前运行。下面是我的代码:


func MigrateUsers(){

  var wg sync.WaitGroup

  userCount:=10 //userDAO.GetUserCount()

  limitSize:=2

  count:=0

  divisor = userCount/limitSize

  for divisor>0{

      wg.Add(1)

      go migrateUserHelper(limitSize,&wg,count)

      divisor =divisor -1

      count=count +1

  }

  wg.Wait()

  fm.Println("DONE BATCHES")

 }

 func migrateUserHelper(limitSize int, count int, wg *sync.WaitGroup) 

 {

   defer wg.Done()

   fmt.Println("Start batch "+strconv.Itoa(count))

   users:= userDAO.GetUsers(limitSize)

   fmt.Println("Fetched Users for batch "+ strconv.Itoa(count))

   userDAO.BulkUpdateUsers(users)

  fmt.Println("Reconciled Users for batch "+ strconv.Itoa(count))

}

我试图在不同的 go 例程中同时更新数据库中的大量记录。


隔江千里
浏览 98回答 1
1回答

汪汪一只猫

WaitGroup是一个计数信号量,可用于在 goroutine 完成工作时对其进行计数,但为此,您需要设置要生成的 goroutine 数量。您可以通过调用方法Add来做到这一点:package mainimport (    "fmt"    "strconv"    "sync")func main() {    migrateUsers()}func migrateUsers() {    var wg sync.WaitGroup    userCount := 10    limitSize := 2    count := 0    divisor := userCount / limitSize    wg.Add(divisor)    for divisor > 0 {        go migrateUserHelper(limitSize, count, &wg)        divisor = divisor - 1        count = count + 1    }    wg.Wait()    fmt.Println("DONE BATCHES")}func migrateUserHelper(limitSize int, count int, wg *sync.WaitGroup) {    defer wg.Done()    fmt.Println("Start batch " + strconv.Itoa(count))    fmt.Println("Fetched Users for batch " + strconv.Itoa(count))    fmt.Println("Reconciled Users for batch " + strconv.Itoa(count))}操场。
随时随地看视频慕课网APP

相关分类

Go
我要回答