Go架构与goroutine底层疑问:go关键字是否将函数放入线程池队列?
关于Go语言
go关键字与轻量级线程的疑问解答 你的理解有部分道理,但需要更精准的拆解:
go关键字的实际动作:它会创建一个名为goroutine(轻量级线程)的用户态执行单元(对应Go runtime中的G结构体),包含待执行函数、初始栈空间等信息,随后将这个G放入调度器的队列(分为P的本地队列或全局队列,而非单纯的线程池队列)。- Go调度器的M:N模型:
- M是操作系统提供的系统线程,属于Go runtime管理的“线程池”资源
- P是逻辑处理器,负责持有goroutine队列,并绑定M来执行队列中的G
- G就是goroutine,是轻量级的用户态执行体
- 对用户的感知:从使用层面看,goroutine的行为和系统线程类似——能并发执行、拥有独立执行流,所以你会觉得像是创建了一个线程。但本质上,goroutine的调度完全由Go runtime掌控,不需要操作系统频繁做上下文切换,且初始栈仅几KB可动态伸缩,资源开销远低于系统线程。
- 和普通线程池的区别:普通线程池是把任务(函数)扔给预先创建的系统线程执行;而goroutine是独立的执行单元,调度逻辑由Go runtime自主实现,比普通线程池的调度效率更高、资源占用更低。
内容的提问来源于stack exchange,提问作者YuriyKortev
相关产品推荐
相关产品推荐

