我看到很多关于如何让Go等待x个Goroutine完成的教程和示例,但我要做的是确保始终有x个Goroutine在运行,所以一个新的Goroutine一结束就会启动.
具体地说,我有几十万件"事情要做",那就是处理从MySQL中传出的一些东西.所以它的工作原理是这样的:
db, err := sql.Open("mysql", connection_string)
checkErr(err)
defer db.Close()
rows,err := db.Query(`SELECT id FROM table`)
checkErr(err)
defer rows.Close()
var id uint
for rows.Next() {
err := rows.Scan(&id)
checkErr(err)
go processTheThing(id)
}
checkErr(err)
rows.Close()
目前,它将发布数十万条processTheThing()
个线程.我需要的是最多启动x个(我们称之为20个)goroutines.因此,它首先为前20行启动20,然后在当前的一个goroutine完成后,它将为下一个id启动一个新的goroutine.因此,在任何时间点,总有20人在 run .
我相信这很简单/标准,但我似乎找不到任何教程或示例的好解释,也找不到如何做到这一点的好解释.