以下是一个简单的示例代码,用于说明Go语言中的GMP模型:
package main
import (
"fmt"
"runtime"
"sync"
)
func main() {
// 设置使用多个逻辑处理器
runtime.GOMAXPROCS(2)
// 创建一个等待组,用于等待所有Goroutine完成
var wg sync.WaitGroup
// 启动两个Goroutine
wg.Add(2)
go printHello(&wg)
go printWorld(&wg)
// 等待所有Goroutine完成
wg.Wait()
}
func printHello(wg *sync.WaitGroup) {
// 在这个Goroutine中打印"Hello"
fmt.Println("Hello")
wg.Done() // 表示Goroutine已完成
}
func printWorld(wg *sync.WaitGroup) {
// 在这个Goroutine中打印"World"
fmt.Println("World")
wg.Done() // 表示Goroutine已完成
}
在上述代码中,我们使用了 runtime.GOMAXPROCS(2)
来设置使用两个逻辑处理器(P)。这样可以并发地执行两个Goroutine。
通过 sync.WaitGroup
来等待所有Goroutine完成。我们创建了一个等待组 wg
,并在每个Goroutine的末尾调用 wg.Done()
来表示Goroutine已完成。wg.Wait()
会阻塞主Goroutine,直到所有Goroutine都完成。
在 printHello
函数和 printWorld
函数中,分别打印 “Hello” 和 “World”。这两个函数会被并发地执行,由两个M(线程)来执行。
通过这个简单的例子,可以看到GMP模型的体现:Goroutine作为并发的执行单元,M(线程)用于执行计算任务,P(逻辑处理器)用于调度和管理Goroutine的执行。