Я вижу множество учебников и примеров о том, как заставить Go ждать, пока число goroutines не закончится, но я пытаюсь сделать так, чтобы всегда было число x, и теперь запускается новый 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()
. Мне нужно, чтобы максимальное число х (мы будем называть его 20) запускаются goroutines. Таким образом, он начинается с запуска 20 для первых 20 строк, и с этого момента он запустит новую версию gotoutine для следующего id в тот момент, когда закончится один из текущих goroutines. Поэтому в любой момент времени всегда работает 20.
Я уверен, что это довольно просто/стандартно, но я не могу найти подходящего объяснения ни в одном из уроков или примеров или о том, как это делается.