怀念夏天 发表于 2024-11-9 10:30:36

GoLang协程Goroutiney原理与GMP模型详解

本文原文地点:GoLang协程Goroutiney原理与GMP模型详解
什么是goroutine

Goroutine是Go语言中的一种轻量级线程,也成为协程,由Go运行时管理。它是Go语言并发编程的焦点概念之一。Goroutine的设计使得在Go中实现并发编程变得非常简单和高效。
以下是一些关于Goroutine的关键特性:

[*]轻量级:Goroutine的创建和切换开销非常小。与操作体系级别的线程相比,Goroutine占用的内存和资源更少。一个典型的Goroutine只需要几KB的栈空间,并且栈空间可以根据需要动态增长。
[*]并发执行:Goroutine可以并发执行多个任务。Go运行时会主动将Goroutine调度到可用的处理器上执行,从而充分利用多核处理器的本领。
[*]简单的语法:启动一个Goroutine非常简单,只需要在函数调用前加上go关键字。例如,go myFunction()会启动一个新的Goroutine来执行myFunction函数。
[*]通讯和同步:Go语言提供了通道(Channel)机制,用于在Goroutine之间进行通讯和同步。通道是一种类型安全的通讯方式,可以在不同的Goroutine之间传递数据。
什么是协程

协程(Coroutine)是一种比线程更轻量级的并发编程方式。它允许在单个线程内执行多个任务,并且可以在任务之间进行切换,而不需要进行线程上下文切换的开销。协程通过协作式多任务处理来实现并发,这意味着任务之间的切换是由程序显式控制的,而不是由操作体系调度的。
以下是协程的一些关键特性:

[*]轻量级:协程的创建和切换开销非常小,由于它们不需要操作体系级别的线程管理。
[*]非抢占式:协程的切换是显式的,由程序员在代码中指定,而不是由操作体系抢占式地调度。
[*]状态保存:协程可以在停息执行时保存其状态,并在恢复执行时继承从停息的地方开始。
[*]异步编程:协程非常适合用于异步编程,特殊是在I/O密集型任务中,可以在等待I/O操作完成时切换到其他任务,从而提高程序的并发性和服从。
Goroutin就是Go在协程这个场景上的实现。
以下是一个简单的go goroutine例子,展示了怎样使用协程:
package mainimport (        "fmt"        "sync"        "time")// 界说一个简单的函数,模拟一个耗时操作func printNumbers(wg *sync.WaitGroup) {        defer wg.Done() // 在函数结束时调用Done方法        for i := 1; i
页: [1]
查看完整版本: GoLang协程Goroutiney原理与GMP模型详解