고루틴이 중단되는 27가지 이유

풀어 주다: 2023-08-08 16:25:34
앞으로
797명이 탐색했습니다.

오늘 글에서는 고파크가 발생하는 27가지 원인에 대해 알려드리겠습니다. 읽기의 편의를 위해 카테고리별로 설명하겠습니다.

1부

로고 의미
waitReasonZero None
waitReasonGCAssistMarking GC 지원 표시
waitReasonIOWait IO 대기
  • waitReasonZero: 사용법으로 볼 때 공식적인 설명은 없습니다. 주로 절전 및 잠금이라는 두 가지 시나리오에 사용됩니다.
  • waitReasonGCAssistMarking: GC 보조 표시 단계로 인해 차단 대기가 발생합니다.
  • waitReasonIOWait: IO가 차단되어 대기 중인 경우(예: 네트워크 요청 등)

2부

로고 의미
waitReasonChanReceiveNilChan chan 수신 찬)
waitReasonChanSendNilChan 찬 보내(닐찬)
  • waitReasonChanReceiveNilChan: 초기화되지 않은 채널에 대한 읽기 작업입니다.
  • waitReasonChanSendNilChan: 초기화되지 않은 채널에 작업을 씁니다.

3부

Logo Meaning
waitReasonDumpingHeap 덤핑 힙
waitReasonGarbageCollection 가비지 수집
waitReasonGarbageCollectionScan 가비지 수집 스캔
  • waitReasonDumpingHeap: Go Heap 힙을 덤프할 때 이 사용 시나리오는 일반적인 pprof 유형의 컬렉션인 Runtime.debug 중에만 차단됩니다.
  • waitReasonGarbageCollection: 가비지 수집 중에 트리거되며 주요 시나리오는 GC 마크 종료 단계입니다.
  • waitReasonGarbageCollectionScan: 가비지 컬렉션 스캔 중에 GC 마크(GC 마크)가 루트 단계를 스캔하면 기본 시나리오가 트리거됩니다.

4부

Logo Meaning
waitReasonPanic기다려 panicwait
waitReasonSelect select
waitReasonSelectNoCases select(사례 없음)
  • waitReasonPanicWait: 메인 고루틴에서 패닉이 발생할 때 트리거됩니다.
  • waitReasonSelect: 키워드 선택을 호출할 때 트리거됩니다.
  • waitReasonSelectNoCases: 키워드 선택 호출 시 사례가 없으면 직접 트리거됩니다.

5부

Logo Meaning
waitReasonGCAssistWait GC 지원 대기
waitReasonGCScavengeWait GC 스윕 대기
waitReasonGCScavengeWait GC 청소 기다려
  • waitReasonGCAssistWait: GC 보조 표시 단계의 종료 동작이 트리거됩니다.
  • waitReasonGCSweepWait: GC 스윕 단계의 종료 동작이 트리거됩니다.
  • waitReasonGCScavengeWait: GC 청소 단계의 종료 동작이 트리거됩니다. GC Scavenge는 주로 새 공간의 가비지 수집입니다. 이는 새 공간에서 작은 개체를 정리하는 작업을 담당하는 자주 실행되는 빠른 GC입니다. ㅋㅋㅋ
  • waitReasonChanSend

chan sendwaitReasonFinalizerWait

finalizer 기다려
  • waitReasonChanReceive: 채널에 대한 읽기 작업이 트리거됩니다.
  • waitReasonChanSend: 채널에 쓸 때 트리거됩니다.
  • waitReasonFinalizerWait: 종료자가 종료되면 트리거됩니다. Go 프로그램에서는 runtime.SetFinalizer 함수를 호출하여 개체에 대한 종료자 함수를 설정할 수 있습니다. 이 동작은 종료 단계로 인한 재활용에 해당합니다.

7부

logo meaning
waitReasonForceGCIdle force gc(유휴)
waitReasonSemacquire semacquire
waitReasonSleep 수면
  • waitReasonForceGCIdle: 강제 GC(유휴 시간)가 종료되면 트리거됩니다.
  • waitReasonSemacquire: 세마포어 처리가 끝나면 트리거됩니다.
  • waitReasonSleep: 전형적인 수면 동작이 실행됩니다.

8부

Logo Meaning
waitReasonSyncCondWait sync.Cond.Wa
waitReasonTimerGoroutineIdle 타이머 고루틴(유휴)
waitReasonTraceReaderBlocked 추적 판독기(차단됨)
  • waitReasonSyncCondWait: sync.Cond 用法能知道,是在调用 sync.Wait 메서드와 결합하면 트리거됩니다.
  • waitReasonTimerGoroutineIdle: 타이머와 관련하여 타이머가 작업을 수행할 필요가 없을 때 트리거됩니다.
  • waitReasonTraceReaderBlocked: Trace와 관련하여 ReadTrace는 바이너리 추적 데이터를 반환하고 데이터를 사용할 수 있을 때까지 차단합니다. ㅋㅋㅋ 주기

waitReasonGCWorkerIdleGC 작업자(유휴)

waitReasonPreempted 선점디버그 호출
waitReasonDebugCall
  • waitReasonWaitForGCCycle: GC 주기를 기다리는 동안 잠자기 상태가 되어 차단이 발생합니다.
  • waitReasonGCWorkerIdle: GC 작업자가 유휴 상태이면 절전 모드가 되어 차단이 발생합니다.
  • waitReasonPreempted: 순환 호출 선점이 발생하면 절전 모드로 전환되어 예약을 기다립니다.
  • waitReasonDebugCall: GODEBUG가 호출될 때 트리거됩니다.

요약

오늘의 글은 시작 부분에 있는 Runtime.gopark 함수에 대한 자세한 설명을 보충한 것입니다.

주요 장면은 다음과 같습니다.

  1. 채널.
  2. 가비지 수집(GC).
  3. 자세요.
  4. 잠금 대기 중입니다.
  5. 선점되었습니다.
  6. IO 차단(IO 대기)
  7. 기타: 패닉, 종료자, 선택 등

이러한 특성을 이용하여 막힘을 유발할 수 있는 원인을 분해할 수 있습니다. 사실 기억할 필요도 없고, 제어 흐름에 영향을 미치는 요소가 있어서 블로킹을 일으키게 되고, 이로 인해 고파크 호출이 발생하게 됩니다.

위 내용은 고루틴이 중단되는 27가지 이유의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:Golang菜鸟
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿