为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
隔江千里 2023-06-01 14:32:56
我有一个调用 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 例程中同时更新数据库中的大量记录。
查看完整描述

1 回答

?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

WaitGroup是一个计数信号量,可用于在 goroutine 完成工作时对其进行计数,但为此,您需要设置要生成的 goroutine 数量。您可以通过调用方法Add来做到这一点:

package main


import (

    "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))

}

操场



查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信