当前位置: 首页 > article >正文

Go 语言并发编程基础:Goroutine 的创建与调度

Go 语言的并发模型是其最显著的语言特性之一。Goroutine 是 Go 实现并发的核心机制,它比线程更轻量,调度效率极高。

本章将带你了解 Goroutine 的基本概念、创建方式以及背后的调度机制。


一、什么是 Goroutine?

Goroutine 是由 Go 运行时(runtime)管理的轻量级线程。

特点:

  • • 启动快:创建成本远小于线程
  • • 占用小:初始栈大小仅约 2 KB,按需增长
  • • 数量多:支持成千上万个 Goroutine 并发运行
  • • 自动调度:由 Go runtime 自动调度到多个线程上执行

二、创建 Goroutine

创建一个 Goroutine 非常简单,只需使用 go 关键字:

func sayHello() {fmt.Println("Hello from Goroutine")
}func main() {go sayHello() // 启动一个新的 Goroutinefmt.Println("Main function")time.Sleep(time.Second) // 等待子协程执行完毕
}

运行效果(输出可能顺序不定):

Main function
Hello from Goroutine

注意:主 Goroutine 退出时,程序将直接终止,其他 Goroutine 即使未完成也会被强制结束。


三、匿名函数启动 Goroutine

可以使用匿名函数快速创建 Goroutine:

go func(name string) {fmt.Println("Hello,", name)
}("Go")

四、Goroutine 的调度模型

Go 使用M:N 调度模型

  • • M(Machine):操作系统线程(OS Thread)
  • • G(Goroutine):用户级协程
  • • P(Processor):逻辑处理器,调度器的核心

调度器作用:

  • • 把成千上万个 G 映射到有限的 M 上
  • • 利用 P 控制并发度(由 GOMAXPROCS 控制)

你可以通过设置 GOMAXPROCS 控制最大并发线程数:

runtime.GOMAXPROCS(2)

默认值为当前机器 CPU 核数。


五、调度器工作方式简要流程

  1. 1. 创建 Goroutine 后,进入可运行队列
  2. 2. 调度器从队列中取出 Goroutine 并分配给线程执行
  3. 3. 阻塞操作(如 IO)会让线程挂起并调度其他 Goroutine
  4. 4. 非抢占式调度 + 安全点机制(某些点才能切换)

六、调试与观察 Goroutine

可以使用 runtime 包查看当前 Goroutine 数量:

fmt.Println("Goroutine数量:", runtime.NumGoroutine())

使用 go tool pprof 或第三方工具(如 delve)分析 Goroutine 状态。


七、使用场景举例

  • • 高并发 Web 服务器处理请求
  • • 定时任务并发执行
  • • 异步日志写入
  • • 并发爬虫

八、小结

特性说明
创建方式使用 go 关键字
性能数量轻量、栈空间动态增长
调度机制M:N 多对多调度,由 runtime 管理
并发优势快速、高效、代码简洁

http://www.lryc.cn/news/2401547.html

相关文章:

  • 三甲医院“AI平台+专家系统”双轮驱动模式的最新编程方向分析
  • 第12期_网站搭建_几时网络验证1.3二改源码包2024 软件卡密系统 虚拟主机搭建笔记
  • [论文阅读] (38)基于大模型的威胁情报分析与知识图谱构建论文总结(读书笔记)
  • SpringBoot EhCache 缓存
  • flutter 中Stack 使用clipBehavior: Clip.none, 超出的部分无法响应所有事件
  • 回溯算法复习(1)
  • 瀚文机械键盘固件开发详解:HWKeyboard.h文件解析与应用
  • 学习路之PHP--webman安装及使用、webman/admin安装
  • Python打卡训练营day45——2025.06.05
  • 益莱储参加 Keysight World 2025,助力科技加速创新
  • 基于cornerstone3D的dicom影像浏览器 第二十八章 LabelTool文字标记,L标记,R标记及标记样式设置
  • 基于责任链模式进行订单参数的校验
  • 电路图识图基础知识-自耦变压器降压启动电动机控制电路(十六)
  • 神经网络与深度学习 网络优化与正则化
  • 【Git系列】如何同步原始仓库的更新到你的fork仓库?
  • PDF.js无法显示数字签名
  • spel 多层list嵌套表达式踩坑记
  • 深度强化学习驱动的智能爬取策略优化:基于网页结构特征的状态表示方法
  • 【网络安全】XSS攻击
  • 如何轻松将视频从安卓设备传输到电脑?
  • 时代星光推出战狼W60智能运载无人机,主要性能超市场同类产品一倍!
  • BUUCTF[极客大挑战 2019]Secret File 1题解
  • Odoo电子邮件使用配置指南
  • 自定义Spring Boot Starter的全面指南
  • Spring Security中的认证实现
  • MacOS解决局域网“没有到达主机的路由 no route to host“
  • 找到每一个单词+模拟的思路和算法
  • 澄清 STM32 NVIC 中断优先级
  • 2025东南亚跨境选择:Lazada VS. Shopee深度对比
  • 如何做好一份技术文档?(上篇)