深入浅出 Go 语言的 GPM 模型(Go1.21)
GPM 模型是指 Go 程序的 Goroutine(协程)、Channel(通道)、M(Machine)的简称,这是 Go 程序并发模型的核心概念。
在 Go 1.21 版本中,GPM 模型有了一些变化,主要体现在对 Machine 的实现上,Machine 的概念被重新定义,并且引入了新的调度器。
以下是一个简单的 Go 程序示例,展示了如何使用 GPM 模型:
package main
import (
"fmt"
"sync"
)
func worker(id int, wg *sync.WaitGroup) {
defer wg.Done() // 确保该协程退出后,WaitGroup 计数减一
fmt.Printf("Worker %d starting\n", id)
// 模拟工作
// ...
fmt.Printf("Worker %d done\n", id)
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1) // 为每个协程添加计数
go worker(i, &wg) // 创建一个新的协程
}
wg.Wait() // 等待所有协程完成
}
在这个例子中,我们使用了 sync.WaitGroup
来等待所有工作协程完成。每个 worker
协程在启动时都会将 WaitGroup 的计数增加1,并在退出时将计数减1。main
函数中的 wg.Wait()
会阻塞,直到 WaitGroup 的计数降到0,表示所有工作协程都已完成。
评论已关闭