Как удостовериться, что рутин полностью запущен перед выходом - PullRequest
0 голосов
/ 11 января 2019

У меня есть функция, вызывающая подпрограмму 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))
}

Я пытаюсь обновить МНОГО записей в базе данных одновременно в разных подпрограммах.

Спасибо

1 Ответ

0 голосов
/ 11 января 2019

WaitGroup является подсчитывающим семафором и может использоваться для подсчета количества операций по завершении работы, но для этого вам нужно указать, сколько подпрограмм вы собираетесь породить. Вы можете сделать это, вызвав метод 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))
}

площадка .

...