gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:31:25 26 4
gpt4 key购买 nike

我有一个调用 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 例程中同时更新数据库中的大量记录。

谢谢

最佳答案

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

playground .

关于mongodb - 如何确保 goroutine 在退出前完全运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54138380/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com