ゴルーチンの状態
Go 1.22.5では、 runtime.Stack に含まれるゴルーチンの状態は次のコードで決められる。
// Basic string statusvar status stringif 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