我目前試圖通過map
來嘗試range
而不是同步執行併發數據庫請求,顯然是因爲速度提升。我怎樣才能使用通道知道什麼時候所有的循環啓動的循環都完成
我的問題是我有這樣的事情:
var mainthreads = make(chan *mainthread)
var mainthreadsFetched = make(chan struct{})
for containerid := range containers {
go func() {
rows, err := db.Query("SELECT thread_id, belongs_to, thread_name, access_level FROM forum_mainthread WHERE belongs_to = ?", containerid)
defer rows.Close()
if err != nil {
log.Println(err)
}
for rows.Next() {
mainthread := &MainThread{}
err := rows.Scan(&mainthread.MainThreadID, &mainthread.BelongsTo, &mainthread.ThreadName, &mainthread.AccessLevel)
if err != nil {
log.Println(err)
}
mainthreads <- mainthread
}
}()
mainthreadsFetched <- struct{}{}
}
// Get all mainthreads
<-mainthreadsFetched
// Do other stuff after complete
顯然mainthreadsFetched <- struct{}{}
被稱爲幾乎是瞬間,因爲循環完成的速度比你眨眼,我怎麼能爲每循環不會阻止新渠道每個新的goroutine
從開始,而是讓循環開始全部goroutines
,然後在每個goroutine
完成時發送通道。
OP明確表示他知道他可以使用sync.WaitGroup,但正在尋找使用渠道的替代方案,因此您根本沒有真正回答他的問題。 – evanmcdonnal
看到我的答案的第二段,我給他這樣一個選擇。我引用'sync.WaitGroup'是因爲它是更好的解決方案,無論他是否想使用它。 – mjibson
@mjibson我不想使用'sync.WaitGroup'的唯一原因是因爲我有一些嵌套的數據庫循環,我最終會得到所有關係數據庫的東西,所以我不想要'wg.Add(1)'和'wg.Done()'嵌套了15遍我認爲頻道應該是更好的解決方案 – Datsik