0

0

会诱发 Goroutine 挂起的 27 个原因

Golang菜鸟

Golang菜鸟

发布时间:2023-08-08 16:25:34

|

893人浏览过

|

来源于Golang菜鸟

转载

今天这篇文章就和大家一起围观 gopark 的 27 个诱发原因。为了方便阅读,我们会根据分类进行说明。

第一部分

标识 含义
waitReasonZero
waitReasonGCAssistMarking GC assist marking
waitReasonIOWait IO wait
  • waitReasonZero:无正式解释,从使用情况来看。主要在 sleep 和 lock 的 2 个场景中使用。
  • waitReasonGCAssistMarking:GC 辅助标记阶段会使得阻塞等待。
  • waitReasonIOWait:IO 阻塞等待时,例如:网络请求等。

第二部分

标识 含义
waitReasonChanReceiveNilChan chan receive (nil chan)
waitReasonChanSendNilChan chan send (nil chan)
  • waitReasonChanReceiveNilChan:对未初始化的 channel 进行读操作。
  • waitReasonChanSendNilChan:对未初始化的 channel 进行写操作。

第三部分

标识 含义
waitReasonDumpingHeap dumping heap
waitReasonGarbageCollection garbage collection
waitReasonGarbageCollectionScan garbage collection scan
  • waitReasonDumpingHeap:对 Go Heap 堆 dump 时,这个的使用场景仅在 runtime.debug 时,也就是常见的 pprof 这一类采集时阻塞。
  • waitReasonGarbageCollection:在垃圾回收时,主要场景是 GC 标记终止(GC Mark Termination)阶段时触发。
  • waitReasonGarbageCollectionScan:在垃圾回收扫描时,主要场景是 GC 标记(GC Mark)扫描 Root 阶段时触发。

第四部分

标识 含义
waitReasonPanicWait panicwait
waitReasonSelect select
waitReasonSelectNoCases select (no cases)
  • waitReasonPanicWait:在 main goroutine 发生 panic 时,会触发。
  • waitReasonSelect:在调用关键字 select 时会触发。
  • waitReasonSelectNoCases:在调用关键字 select 时,若一个 case 都没有,会直接触发。

第五部分

标识 含义
waitReasonGCAssistWait GC assist wait
waitReasonGCSweepWait GC sweep wait
waitReasonGCScavengeWait GC scavenge wait
  • waitReasonGCAssistWait:GC 辅助标记阶段中的结束行为,会触发。
  • waitReasonGCSweepWait:GC 清扫阶段中的结束行为,会触发。
  • waitReasonGCScavengeWait:GC scavenge 阶段的结束行为,会触发。GC Scavenge 主要是新空间的垃圾回收,是一种经常运行、快速的 GC,负责从新空间中清理较小的对象。

第六部分

标识 含义
waitReasonChanReceive chan receive
waitReasonChanSend chan send
waitReasonFinalizerWait finalizer wait
  • waitReasonChanReceive:在 channel 进行读操作,会触发。
  • waitReasonChanSend:在 channel 进行写操作,会触发。
  • waitReasonFinalizerWait:在 finalizer 结束的阶段,会触发。在 Go 程序中,可以通过调用 runtime.SetFinalizer 函数来为一个对象设置一个终结者函数。这个行为对应着结束阶段造成的回收。

第七部分

标识 含义
waitReasonForceGCIdle force gc (idle)
waitReasonSemacquire semacquire
waitReasonSleep sleep
  • waitReasonForceGCIdle:强制 GC(空闲时间)结束时,会触发。
  • waitReasonSemacquire:信号量处理结束时,会触发。
  • waitReasonSleep:经典的 sleep 行为,会触发。

第八部分

标识 含义
waitReasonSyncCondWait sync.Cond.Wait
waitReasonTimerGoroutineIdle timer goroutine (idle)
waitReasonTraceReaderBlocked trace reader (blocked)
  • waitReasonSyncCondWait:结合 sync.Cond 用法能知道,是在调用 sync.Wait 方法时所触发。
  • waitReasonTimerGoroutineIdle:与 Timer 相关,在没有定时器需要执行任务时,会触发。
  • waitReasonTraceReaderBlocked:与 Trace 相关,ReadTrace会返回二进制跟踪数据,将会阻塞直到数据可用。

第九部分

标识 含义
waitReasonWaitForGCCycle wait for GC cycle
waitReasonGCWorkerIdle GC worker (idle)
waitReasonPreempted preempted
waitReasonDebugCall debug call
  • waitReasonWaitForGCCycle:等待 GC 周期,会休眠造成阻塞。
  • waitReasonGCWorkerIdle:GC Worker 空闲时,会休眠造成阻塞。
  • waitReasonPreempted:发生循环调用抢占时,会会休眠等待调度。
  • waitReasonDebugCall:调用 GODEBUG 时,会触发。

总结

今天这篇文章是对开头 runtime.gopark 函数的详解文章的一个补充,我们能够对此了解到其诱发的因素。

主要场景为:

  1. 通道(Channel)。
  2. 垃圾回收(GC)。
  3. 休眠(Sleep)。
  4. 锁等待(Lock)。
  5. 抢占(Preempted)。
  6. IO 阻塞(IO Wait)
  7. 其他,例如:panic、finalizer、select 等。

我们可以根据这些特性,去拆解可能会造成阻塞的原因。其实也就没必要记了,他们会导致阻塞肯定是由于存在影响控制流的因素,才会导致 gopark 的调用。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

Golang channel原理
Golang channel原理

本专题整合了Golang channel通信相关介绍,阅读专题下面的文章了解更多详细内容。

246

2025.11.14

golang channel相关教程
golang channel相关教程

本专题整合了golang处理channel相关教程,阅读专题下面的文章了解更多详细内容。

342

2025.11.17

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

131

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

54

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
golang socket 编程
golang socket 编程

共2课时 | 0.1万人学习

nginx浅谈
nginx浅谈

共15课时 | 0.8万人学习

golang和swoole核心底层分析
golang和swoole核心底层分析

共3课时 | 0.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号