Skip to content

ゴルーチンの状態

Go 1.22.5では、 runtime.Stack に含まれるゴルーチンの状態は次のコードで決められる。

// Basic string status
var status string
if 0 <= gpstatus && gpstatus < uint32(len(gStatusStrings)) {
status = gStatusStrings[gpstatus]
} else {
status = "???"
}
// Override.
if gpstatus == _Gwaiting && gp.waitreason != waitReasonZero {
status = gp.waitreason.String()
}

このときBasic string statusは以下の通り。

  • idle
  • runnable
  • running
  • syscall
  • waiting
  • dead
  • copystack
  • preempted

また、waiting の場合はさらに分岐する場合がある。

  • GC assist marking
  • IO wait
  • chan receive (nil chan)
  • chan send (nil chan)
  • dumping heap
  • garbage collection
  • garbage collection scan
  • panicwait
  • select
  • select (no cases)
  • GC assist wait
  • GC sweep wait
  • GC scavenge wait
  • chan receive
  • chan send
  • finalizer wait
  • force gc (idle)
  • semacquire
  • sleep
  • sync.Cond.Wait
  • sync.Mutex.Lock
  • sync.RWMutex.RLock
  • sync.RWMutex.Lock
  • trace reader (blocked)
  • wait for GC cycle
  • GC worker (idle)
  • GC worker (active)
  • preempted
  • debug call
  • GC mark termination
  • stopping the world
  • flushing proc caches
  • trace goroutine status
  • trace proc status
  • page trace flush
  • coroutine