一文解析golang中的协程与GMP模型
协程,也称为协作式多任务或 Coroutines,是一种轻量级的线程。在 Golang 中,协程可以用于实现并发,但不需要操作系统的线程支持,这使得协程的切换和恢复的成本更低。
Golang 使用 G(Goroutine)、P(Processor)、M(Machine)三个实体来实现GMP模型。
- G (Goroutine): 代表一个执行单元,每个Goroutine可以运行一个函数。
- P (Processor): 代表一个处理单元,负责执行Goroutine。
- M (Machine): 代表一个线程,由操作系统调度。
GMP模型的工作方式是:
- 当一个 M 线程进入空闲状态(无 G 可运行)时,会回收其相关的 P。
- 当需要启动一个新的 G 时,如果此时没有足够的 P 可用,运行时会创建一个新的 M 和相应的 P。
- 当 G1 阻塞时(例如,在网络调用中),可以启动一个新的 G2 运行在同一 M 线程上,从而利用线程的整个生命周期。
下面是一个简单的 Golang 代码示例,展示了如何创建和使用协程:
package main
import (
"fmt"
"time"
)
func hello(gr string) {
fmt.Println("Hello,", gr)
time.Sleep(time.Second)
fmt.Println("Bye,", gr)
}
func main() {
fmt.Println("Start main() function.")
// 创建一个goroutine
go hello("Alice")
go hello("Bob")
// 让当前线程暂停,以等待其他goroutine运行,否则可能程序会立即退出
time.Sleep(2 * time.Second)
fmt.Println("End main() function.")
}
在这个例子中,我们创建了两个协程,分别向控制台打印欢迎信息和告别信息。time.Sleep(time.Second)
用于模拟一些计算或者 IO 操作。主函数最后调用 time.Sleep(2 * time.Second)
是为了确保两个协程有足够的时间执行。通过这个简单的例子,我们可以理解和应用 Golang 中的协程和 GMP 模型。
评论已关闭