goroutine传参panic,原因在源码中找到了

简介: goroutine传参panic,原因在源码中找到了

goroutine传参 有点可怕



1.背景


我昨天写一个需求,老版本继续跑它的逻辑,新版本我Go出去,看看新老版本对比结果,之所以Go出去是因为担心影响线上服务,比如不用Go出去,如果代码异常或者阻塞,就会影响老版本逻辑的执行,因此这里采用Goroutine的方式去处理。


2.代码


640.png


3.上线跑起来

640.png


goroutine报错了。


4.上网解决


上网搜索了之后才明白:


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


5. 解决办法


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


我采用的就是第一种,改为指针类型传递。


6. 源码


// The minimum size of stack used by Go code
 _StackMin = 2048
//go:systemstack
func newproc1(fn *funcval, argp unsafe.Pointer, narg int32, callergp *g, callerpc uintptr) *g {
 _g_ := getg()
 if fn == nil {
  _g_.m.throwing = -1 // do not dump full stacks
  throw("go of nil func value")
 }
 acquirem() // disable preemption because it can be holding p in a local var
 siz := narg
 siz = (siz + 7) &^ 7
 // We could allocate a larger initial stack if necessary.
 // Not worth it: this is almost always an error.
 // 4*sizeof(uintreg): extra space added below
 // sizeof(uintreg): caller's LR (arm) or return address (x86, in gostartcall).
 // 这里有判断 大于2048即2K就panic
 if siz >= _StackMin-4*sys.RegSize-sys.RegSize {
  throw("newproc: function arguments too large for new goroutine")
 }
  ...
}


7. 小结


用goroutine一定要小心,参数不易过大,否则上线之后头就大了。另外就是看源码,写的很明白,避坑指南要收藏好!

相关文章
|
5月前
|
算法 决策智能
多智能体一致性算法
多智能体一致性算法
345 126
|
9月前
|
编解码 人工智能
通义万相Wan2.1-VACE开源!业内首个视频编辑统一模型!附推理教程
通义万相Wan2.1-VACE开源!业内首个视频编辑统一模型!附推理教程
1904 7
|
机器学习/深度学习 人工智能 搜索推荐
AI与时尚产业:个性化购物体验
在科技日新月异的今天,人工智能(AI)正深刻改变时尚产业。AI不仅为时尚设计注入新活力,还通过个性化推荐、虚拟试穿和优化客户服务,极大提升了消费者的购物体验。本文探讨AI如何重塑时尚产业,为消费者带来前所未有的个性化购物享受。
公司网站图片如何修改
公司网站图片如何修改
|
开发者
如何画好一张架构图/业务图/流程图,掌握这4个关键点
作为一个开发,日常工作中免不了要画一些图,无论是技术架构图还是业务流程图。基于个人的一些经验,作者分享了他的作图方法,给大家一点思路提供参考,希望在未来的工作、生活中都能有所帮助。
|
机器学习/深度学习 人工智能 自然语言处理
深入理解深度学习中的卷积神经网络(CNN)
【10月更文挑战第10天】深入理解深度学习中的卷积神经网络(CNN)
520 0
|
缓存 测试技术 API
告别加班!Django/Flask高级技巧,让你的Web开发效率翻倍再翻倍!
【7月更文挑战第15天】探索Django与Flask高效秘籍:**利用模板继承减少重复代码,自动化测试确保质量,缓存提升性能。通过模板继承实现DRY原则,自动化测试框架如Django的`TestCase`和Flask的`pytest`加快调试,缓存机制(Django的低级别缓存API或Flask-Caching)优化页面加载。掌握这些技巧,告别加班,提升开发体验!
540 3
|
Java 开发者
Java的多线程编辑
Java的多线程编辑
135 5
|
人工智能 Serverless 异构计算
【有奖体验】AI 都这么厉害了,可以看图生成文字描述!
一个可以智能识别图片,AI 智能文案描写,以后再也不用怕文案写不出来了!