我想并行獲取資料。例如,我有一個UserID(字串)陣列,我想并行獲取該陣列的所有用戶,最后有一個陣列Users:
func getUser(userIDs []string) {
var users []User
var user User
// We create a waitgroup - basically block until N tasks say they are done
wg := sync.WaitGroup{}
// We add 1 to the wait group - each worker will decrease it back
wg.Add(len(userIDs))
for id := range userIDs {
user, err = h.Repository.GetUserByID(id)
// Here is the problem. I should do a
go h.Repository.GetUserByID(id)
// to be parallel, but then I can not receive the user result
users = append(users, user)
wg.Done()
}
// Now we wait for everyone to finish - again, not a must.
// You can just receive from the channel N times, and use a timeout or something for safety
wg.Wait()
}
我如何呼叫為我提供并行用戶的函式,同時將值保存在陣列中?
應該var user User在回圈內嗎?如果它在外面,我可以有競爭條件嗎?
uj5u.com熱心網友回復:
鑒于您無法控制Repository.GetUserByID,并且無法將頻道直接傳遞給它,我會執行以下操作:
func getUser(userIDs []string) {
var users []User
ch := make(chan User)
for id := range userIDs {
go func(ch chan User, id string){
user, err := h.Repository.GetUserByID(id)
if err != nil {
println(err)
return
}
ch <- user
}(ch, id)
}
for range userIDs {
users = append(users, <-ch)
}
}
從 goroutine 寫入切片可能會導致并發問題。所以不推薦。Golang 有專門用于此的通道。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/388904.html
標籤:去
上一篇:如何使用golang在clickhouse中使用一個命令插入csv檔案
下一篇:開發多模塊Go作業區的問題
