一文解析golang中的协程与GMP模型
    		       		warning:
    		            这篇文章距离上次修改已过437天,其中的内容可能已经有所变动。
    		        
        		                
                协程,也称为协作式多任务或 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 模型。
评论已关闭