Go 中的线程 Goroutine:同时运行恒定数量
Go 并发领域提供了大量关于等待指定数量的 Goroutine 完成的材料。然而,一个明显的挑战出现了:确保连续执行预定义数量的 goroutine,一个开始另一个结束。
考虑一个具有大量任务的场景,例如处理从 MySQL 检索的数据数据库。一种简单的方法可能会启动大量并行 goroutine,同时执行数十万个任务。相反,所需的行为将并发运行的 goroutine 限制为固定数量(例如 20)。
这种受控并发模式称为“有界并行性”。在 Go 中实现这种模式需要使用一个空结构通道作为信号量,指示并发工作协程的最大数量。这是一个例子:
package main import "fmt" func main() { maxGoroutines := 10 guard := make(chan struct{}, maxGoroutines) for i := 0; i < 30; i++ { guard <- struct{}{} // blocks if guard channel is full go func(n int) { worker(n) <-guard // unlocks a slot in guard }(i) } } func worker(i int) { fmt.Println("doing work on", i) }
这个实现确保并发执行的 goroutine 数量不超过指定数量。结果,当一个worker goroutine完成时,一个新的goroutine会立即启动,从而维持所需的并发级别。
“Go并发模式”文章在“有限并行性”部分进一步探讨了这个概念,提供了更深入的了解深入了解这一关键的并发技术。
以上是Go 中如何保持同时运行的 Goroutine 数量恒定?的详细内容。更多信息请关注PHP中文网其他相关文章!