使用社交账号登录
Goroutine是Go语言中的轻量级线程,是Go并发编程的基础单元。通过go内置关键字可以创建一个新的Goroutine,例如:
这使得Go语言天生支持并发编程,而不需要像其他语言那样显式地创建线程。
Go 的并发模型深受 CSP(Communicating Sequential Processes)理论启发。在该模型中,程序被划分为多个独立的 Goroutine,它们之间通过 Channel 传递消息来协同工作。这种“通过通信来共享内存”的机制,从根本上规避了传统多线程模型中由于直接共享内存而产生的复杂锁竞争问题。
Go 语言有一句著名的格言:“不要通过共享内存来通信,而要通过通信来共享内存。” (Do not communicate by sharing memory; instead, share memory by communicating.) 这句话是理解 Go 并发模型的灵魂。
并发(Concurrency):指在同一时间段内“处理”多个任务的能力。它侧重于任务的组织与调度,通过在任务间快速切换实现逻辑上的“同时”。 并行(Parallelism):指在同一时刻“执行”多个任务的能力。它侧重于利用多核硬件资源,实现物理上的真正“同时”。
Go 的并发模型通过 Goroutine 提供了优秀的任务组织方式。在多核 CPU 环境下,Go 调度器能够自动将多个 Goroutine 分发到不同的硬件核心上,从而将“逻辑上的并发”转化为“物理上的并行”。
在 Go 调度器的管理下,Goroutine 的执行是异步且非确定性的。基于 GMP 模型,Go 实现了多核间的物理并行与单核内的逻辑并发:它既能将任务分发到不同核心同时运行,也能在单个核心上通过极速切换处理海量任务,从而实现真正的高性能并发。
为了更好地理解“每个核也能并发执行”,我们可以把 CPU 想象成一个高速运转的工厂:
GMP 是 Go 语言的线程模型,包含三个核心概念:内核线程(M)、协程(G)以及逻辑处理器(P)。

GMP
GOMAXPROCS 决定,代表了真正的并行度。Go 调度器的职责是将所有处于 runnable 状态的 Goroutines 均匀分布到在 P 上运行的 M 中。它采用了 M:N 模型:即 M 个 Goroutine 被分配到 N 个内核线程上,而这些线程运行在最多 GOMAXPROCS 个逻辑处理器(P)上。
GOMAXPROCS 设置了 P(逻辑处理器)的数量。Go 调度器将 G 分配给 P,而操作系统(OS)负责将承载 P 的内核线程(M)分发到不同的物理 CPU 核心上。这种“多核分流 + 单核抢占”的组合拳,正是 Go 能够以极低资源消耗处理海量并发任务的核心秘诀。
go func() {
// 并发执行的代码
}()
package main
import (
"fmt"
"time"
)
func main() {
// 创建多个 Goroutine 并发执行
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Printf("Goroutine %d 正在执行\n", i)
}(i)
}
time.Sleep(time.Second) // 等待协程执行完毕
}