深入解析 Go 语言 GMP 模型:并发编程的核心机制
warning:
这篇文章距离上次修改已过193天,其中的内容可能已经有所变动。
package main
import (
"fmt"
"runtime"
"sync"
)
var wg sync.WaitGroup
func worker(id int, c chan int) {
defer wg.Done() // 告诉 WaitGroup 当前的 goroutine 已经完成
for n := range c {
fmt.Printf("Worker %d received %d\n", id, n)
}
}
func main() {
runtime.GOMAXPROCS(1) // 设置 CPU 核心数为1,以便于我们可以更容易地观察输出
c := make(chan int, 10) // 创建一个缓冲为10的通道
// 创建三个工作的 goroutine
for i := 0; i < 3; i++ {
wg.Add(1) // 为每个 goroutine 设置 WaitGroup 的计数器
go worker(i, c)
}
// 发送一些数据到通道 c
for i := 0; i < 5; i++ {
c <- i
}
close(c) // 关闭通道,这会导致 range 循环在 worker 中结束
wg.Wait() // 等待所有的 goroutines 完成
}
这段代码创建了一个有三个工作的goroutine的程序,它们通过通道接收数据。程序使用了sync.WaitGroup
来确保主程序等待所有工作的goroutine完成后再退出。这是Go语言并发编程中的一个常见模式,对于理解GMP模型非常有帮助。
评论已关闭