gpt4 book ai didi

go - 总是有 x 个 goroutine 在任何时候运行

转载 作者:IT老高 更新时间:2023-10-28 13:01:23 26 4
gpt4 key购买 nike

我看到很多关于如何让 Go 等待 x 个 goroutine 完成的教程和示例,但我想要做的是确保始终有 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() 线程。我需要的是启动最多 x 个(我们称之为 20 个)goroutine。因此,它首先为前 20 行启动 20 个,然后在当前 goroutine 之一完成的那一刻,它将为下一个 id 启动一个新的 goroutine。所以在任何时间点总是有 20 个在运行。

我确信这很简单/标准,但我似乎找不到任何关于任何教程或示例或如何完成的很好的解释。

最佳答案

您可能会发现 Go Concurrency Patterns文章很有趣,尤其是 Bounded parallelism 部分,它解释了您需要的确切模式。

您可以使用 channel of empty structs as a limiting guard to control number of concurrent worker goroutines :

package main

import "fmt"

func main() {
maxGoroutines := 10
guard := make(chan struct{}, maxGoroutines)

for i := 0; i < 30; i++ {
guard <- struct{}{} // would block if guard channel is already filled
go func(n int) {
worker(n)
<-guard
}(i)
}
}

func worker(i int) { fmt.Println("doing work on", i) }

关于go - 总是有 x 个 goroutine 在任何时候运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25306073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com