Go的CSP并发模型实现M, P, G简介
在Go语言中,M、P和G是并发模型的核心组成部分。
- M:Machine(机器),代表系统的线程,即OS线程或用户级线程。
- P:Processor(处理器),代表执行用户代码的上下文,有一个运行队列,可以调度G。
- G:Goroutine(Go程),代表一个执行单元。
在Go程序启动时,会创建若干个M,并初始化一个P,然后创建G。M、P和G之间的关系如下:
- 一个M可以关联一个或多个P。
- 一个P可以在一个M上执行,如果这个M不忙,也可以在其他M上执行。
- 一个G需要被绑定到一个P上执行。
在Go语言中,M的数量可以通过GOMAXPROCS
来设置,限制了最大的P的数量。P的数量可以动态变化,G也可以在不同的P之间迁移。
以下是一个简单的例子,展示了如何创建Go程以及它们之间的运行:
package main
import (
"fmt"
"runtime"
)
func main() {
// 设置P的数量
runtime.GOMAXPROCS(1)
// 创建一个Go程
go func() {
fmt.Println("Hello from a goroutine!")
}()
// 主Go程执行一段时间后退出
for i := 0; i < 100; i++ {
runtime.Gosched() // 让出时间片,让其他Go程有执行的机会
}
}
在这个例子中,我们设置了程序最多只能使用一个处理器核心(runtime.GOMAXPROCS(1)
),然后创建了一个Go程来执行打印操作。主Go程通过runtime.Gosched()
主动让出时间片,以允许其他Go程有执行的机会。
评论已关闭