我目前试图通过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