goroutine 是 go 并发编程的核心,它是一种由 go 运行时管理的轻量级线程,相比传统线程占用更少内存(初始栈空间仅 2kb),可轻松创建成千上万个;其调度基于 m-p-g 模型,其中 g 表示 goroutine,m 表示系统线程,p 表示处理器,go 调度器通过绑定 m 和 p 来执行 g,并自动处理阻塞和负载均衡;实际使用中需注意避免无限制创建 goroutine、处理同步问题以及确保 goroutine 能正常退出以防止资源耗尽和内存泄漏。

Goroutine 是 Go 语言中实现并发编程的核心机制,你可以把它理解为一种“轻量级线程”。它由 Go 运行时(runtime)管理,而不是操作系统直接调度,这意味着你可以在一个程序中轻松启动成千上万个 goroutine,而不会像传统线程那样带来巨大的资源开销。

传统的操作系统线程通常默认栈大小是几MB,如果你开启几千个线程,内存占用会非常大。而 Go 的 goroutine 初始栈空间只有 2KB 左右,并且可以根据需要动态增长或缩小。
举个例子:
如果你在 Go 中写一个函数:

func sayHello() {
fmt.Println("Hello")
}然后用一行代码启动一个 goroutine:
立即学习“go语言免费学习笔记(深入)”;
go sayHello()
你就创建了一个并发执行的任务。这个任务几乎不占多少内存,而且切换成本很低。Go 的运行时会自动管理这些 goroutine 的生命周期和调度。

Go 的调度器使用 M-P-G 模型来管理 goroutine 的执行:
简单来说,每个 P 可以绑定一个 M 来运行 G。Go 程序启动时,默认会创建与 CPU 核心数相等的 P,这样就能充分利用多核并行处理。
几个关键点:
这种设计使得 goroutine 的调度效率非常高,同时也避免了线程爆炸的问题。
虽然 goroutine 很轻量,但在实际开发中还是有一些容易踩坑的地方:
go func(),可能会导致资源耗尽或竞争问题。举个例子:
for i := 0; i < 10000; i++ {
go func() {
// 做一些事情
}()
}这段代码会瞬间创建一万个 goroutine。如果你没有合适的控制逻辑,可能会影响性能甚至稳定性。
Goroutine 是 Go 并发模型的基础,它的轻量化设计和高效的调度机制让并发编程变得简单又高效。虽然你不用关心底层调度细节,但了解基本原理有助于写出更健壮的并发程序。
基本上就这些。
以上就是Golang中的goroutine是什么 解析轻量级线程与调度原理的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号