在现代软件开发中,Go语言因其简洁、高效和强大的并发能力而广受欢迎。其中,goroutine 是 Go 实现并发的核心机制。本文将从零开始,详细讲解 goroutine 的创建方式、底层调度原理,帮助初学者轻松掌握 Go语言并发编程 的精髓。
Goroutine 是 Go 运行时(runtime)管理的轻量级线程。与操作系统线程不同,goroutine 的开销极小(初始栈仅 2KB),可以轻松创建成千上万个而不影响性能。你只需在函数调用前加上 go 关键字,即可启动一个新的 goroutine。
package mainimport ( "fmt" "time")func sayHello() { fmt.Println("Hello from goroutine!")}func main() { go sayHello() // 启动一个 goroutine time.Sleep(time.Second) // 等待 goroutine 执行完成}注意:主 goroutine(main 函数)如果提前结束,其他 goroutine 也会被强制终止。因此上面使用 time.Sleep 来确保子 goroutine 有时间执行。
当你使用 go func() 时,Go 运行时会执行以下步骤:

Go 的调度器采用 GMP 模型,这是理解 调度原理 的关键:
每个 P 维护一个本地 runqueue(运行队列),当 M 需要执行任务时,会从关联的 P 中获取 G。如果本地队列为空,调度器会尝试从其他 P 的队列“偷”任务(work-stealing),以实现负载均衡。
相比传统线程,goroutine 具有以下优势:
在实际开发中,我们通常使用 sync.WaitGroup 来等待所有 goroutine 完成,而不是用 time.Sleep:
package mainimport ( "fmt" "sync")func worker(id int, wg *sync.WaitGroup) { defer wg.Done() // 任务完成后通知 WaitGroup fmt.Printf("Worker %d is working\n", id)}func main() { var wg sync.WaitGroup for i := 1; i <= 3; i++ { wg.Add(1) // 每启动一个 goroutine,计数加 1 go worker(i, &wg) } wg.Wait() // 阻塞直到所有 goroutine 调用 Done() fmt.Println("All workers finished.")}通过本文,我们深入学习了 Go语言 中 goroutine 的创建方式与底层 调度原理。GMP 模型让 Go 在 并发编程 领域表现出色,既高效又易于使用。掌握这些知识,是迈向高性能 Go 应用开发的重要一步。
希望这篇教程能帮助你轻松入门 Go 并发编程!
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://vpshk.cn/2025126391.html