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

Go 踩过的坑之协程参数不能过大

文章目录

    • 一、问题
    • 二、原因
    • 三、解决:
    • 四、修改:
    • 五、总结

一、问题

在日常开发过程中,我们通常会使用协程来并发处理数据,比如下面的例子采用 协程 + sync.WaitGroup 来并发处理数据:

从mysql请求的切片数据,遍历后开启协程根据指定字段统计数据,此处采用了协程组的方式提高效率

代码如下:

//结构体
type RespStruct struct{struct01 //内嵌另外的结构体struct02 //内嵌另外的结构体
}
func StatisticData(){var respData []RespStructvar wg sync.WaitGroup//1.从mysql查询数据,封装到respData ,代码省略//2.循环respData并且开启协程组,添加协程for i, d := range respData {wg.Add(1)go func(req ProduceOrderProcessQueryRespParam) {defer func() {wg.Done()}()//打印参数fmt.Println(req)return}(d)}wg.wait()fmt.Println("end.....")
}

输出报错:

fatal error: newproc: function arguments too large for new goroutine

二、原因

由于结构体嵌结构体,变成新的比较大的结构体d。那么在启动新协程的时候,又因为是值传递,新copy了一份d的副本,导致参数超过了新goroutine的可用堆栈空间。 goroutine默认分配2k的内存

三、解决:

  • 1.改为指针类型传递(推荐)
  • 2.减少传递参数的大小,只传入需要使用的参数(推荐)
  • 3.去除协程

四、修改:

将协程 的匿名函数修改为函数调用方式;代码修改如下

//结构体
type RespStruct struct{struct01 //内嵌另外的结构体struct02 //内嵌另外的结构体
}
func StatisticData(){var respData []RespStructvar wg sync.WaitGroup//1.从mysql查询数据,封装到respData ,代码省略//2.循环respData并且开启协程组,添加协程for i, d := range respData {wg.Add(1)go func(req *ProduceOrderProcessQueryRespParam) {defer func() {wg.Done()}()//打印参数fmt.Println(req)return}(&d)}wg.wait()fmt.Println("end.....")
}

正常输出

五、总结

该报错的主要原因:新开 goroutine 的可用堆栈空间默认分配2k的内存
故传入的参数不宜过大,否则导致程序panic

解决方法也很简单,只需要通过指针引用的方式即可解决

原文地址

Go 踩过的坑之协程参数不能过大

http://www.dtcms.com/a/321008.html

相关文章:

  • Chat GPT5功能
  • ESP32-menuconfig(3) -- Serial flasher config
  • 宁商平台税务升级之路:合规为纲,服务为本
  • 唯品会以图搜图(拍立淘)API接口调用指南详解
  • Vite React项目引入unocss 及 @unocss/preset-icons的使用
  • Mac安装python、conda环境教程
  • 相机坐标系与世界坐标系的点相互转换:原理、可视化与实践
  • Spring MVC REST API设计详解:从零构建高效接口
  • 2025 TexLive+VScode排版IEEE TGRS论文
  • 使用 Gulp 替换 XML 文件内容
  • SpringMVC(四)
  • 跨平台音乐管理新方案:Melody如何实现一站式音源整合
  • 设计模式(二)——策略模式
  • MySQL 索引详细说明
  • 12. 消息队列-RabbitMQ
  • 行业速览:中国新能源汽车市场格局与关键趋势
  • 【LLM实战】RAG初体验,两种实现方式
  • wstool的一个完整的工作流解析
  • 安全合规1--实验:ARP欺骗、mac洪水攻击、ICMP攻击、TCP SYN Flood攻击
  • 【Day 19】Linux-网站操作
  • mac笔记本如何重新设置ssh key
  • 使用 ECharts GL 实现 3D 中国地图点位飞线效果
  • GoLand 项目从 0 到 1:第六天 —— 权限接口开发与问题攻坚
  • 笔试——Day32
  • pycharm常见环境配置和快捷键
  • 微软XBOX游戏部门大裁员
  • vue项目常见BUG和优化注意事项
  • HTTP 请求返回状态码和具体含义?200、400、403、404、502、503、504等
  • OpenBMC中libgpio架构与驱动交互全解析:从硬件映射到应用控制
  • 智能厨具机器人的革命性升级:Deepoc具身模型外拓板技术解析