Heim >Backend-Entwicklung >Golang >27 Gründe, warum Goroutine hängt

27 Gründe, warum Goroutine hängt

Golang菜鸟
Golang菜鸟nach vorne
2023-08-08 16:25:34829Durchsuche

Der heutige Artikel wird Ihnen die 27 Ursachen für Gopark vorstellen. Um die Lektüre zu erleichtern, erklären wir die Erklärung nach Kategorien.

Teil Eins

Logo Bedeutung
waitReasonZero None
waitReasonGCAssistMarking GC Assist Marking
waitReasonIOWait IO warte
  • waitReasonZero: Keine offizielle Erklärung, gemessen an der Verwendung. Wird hauptsächlich in zwei Szenarien verwendet: Schlafen und Sperren.
  • waitReasonGCAssistMarking: Die GC-Hilfsmarkierungsphase führt zu blockierendem Warten.
  • waitReasonIOWait: Wenn IO blockiert ist und wartet, zum Beispiel: Netzwerkanfrage usw.

Teil 2

Logo Bedeutung
waitReasonChanReceiveNilChan chan empfangen il chan)
waitReasonChanSendNilChan chan send (nil chan)
  • waitReasonChanReceiveNilChan: Lesevorgänge auf nicht initialisierten Kanälen.
  • waitReasonChanSendNilChan: Schreibvorgang in einen nicht initialisierten Kanal. Teil 3

waitReasonGarbageCollectionGarbage Collection

waitReasonGarbageCollectionScanGarbage Collection Scan
  • waitReasonDumpingHeap: Beim Speichern des Go-Heap-Heaps wird dieses Verwendungsszenario nur während runtime.debug blockiert, dem üblichen pprof-Erfassungstyp.
  • waitReasonGarbageCollection: Das Hauptszenario wird während der Garbage Collection ausgelöst und ist die Phase der GC-Markierung.
  • waitReasonGarbageCollectionScan: Während des Garbage-Collection-Scans wird das Hauptszenario ausgelöst, wenn die GC-Markierung (GC Mark) die Root-Stufe scannt.

Teil 4

waitReasonSelectselectwaitReasonSelectNoCasesselect (keine Fälle)
  • waitReasonPanicWait: Wird ausgelöst, wenn in der Haupt-Goroutine eine Panik auftritt.
  • waitReasonSelect: Wird beim Aufruf der Schlüsselwortauswahl ausgelöst.
  • waitReasonSelectNoCases: Wenn beim Aufrufen der Schlüsselwortauswahl kein Fall vorhanden ist, wird dieser direkt ausgelöst. Teil 5

waitReasonGCScavengeWaitGC Sweep warte

waitReasonGCScavengeWait
Logo Bedeutung:
GC Aufräumen warten
  • waitReasonGCAssistWait: Das Endverhalten in der GC-Hilfsmarkierungsphase wird ausgelöst.
  • waitReasonGCSweepWait: Das Endverhalten in der GC-Sweep-Phase wird ausgelöst.
  • waitReasonGCScavengeWait: Das Endverhalten der GC-Scavenge-Phase wird ausgelöst. GC Scavenge ist hauptsächlich eine Speicherbereinigung von neuem Speicherplatz. Es handelt sich um einen häufig ausgeführten, schnellen GC, der für die Bereinigung kleinerer Objekte aus neuem Speicherplatz verantwortlich ist. Teil Sechs
waitReasonChanSend

chan send

waitReasonFinalizerWait
finalizer warte
  • waitReasonChanReceive: Der Lesevorgang für den Kanal wird ausgelöst.
  • waitReasonChanSend: Wird beim Schreiben im Kanal ausgelöst.
  • waitReasonFinalizerWait: wird ausgelöst, wenn der Finalizer endet. In einem Go-Programm können Sie eine Finalizer-Funktion für ein Objekt festlegen, indem Sie die Funktion runtime.SetFinalizer aufrufen. Dieses Verhalten entspricht dem durch die Endphase verursachten Recycling.

Teil 7

Logo Bedeutung
waitReasonForceGCIdle force gc (idle)
waitReasonSemacquire semacquire
waitReasonSleep schlafen
  • waitReasonForceGCIdle: Wird ausgelöst, wenn die erzwungene GC (Leerlaufzeit) endet.
  • waitReasonSemacquire: Wird ausgelöst, wenn die Semaphorverarbeitung endet.
  • waitReasonSleep: klassisches Schlafverhalten, wird ausgelöst.

Teil 8

Logo Bedeutung
waitReasonSyncCondWait sync.Cond.Wait.
waitReasonTimerGoroutineIdle timer goroutine (idle)
waitReasonTraceReaderBlocked Trace-Reader (blockiert)
  • waitReasonSyncCondWait: Wird bei Kombination mit der sync.Cond 用法能知道,是在调用 sync.Wait-Methode ausgelöst.
  • waitReasonTimerGoroutineIdle: Bezogen auf den Timer, wird es ausgelöst, wenn kein Timer zum Ausführen von Aufgaben vorhanden ist.
  • waitReasonTraceReaderBlocked: Im Zusammenhang mit Trace gibt ReadTrace binäre Trace-Daten zurück und blockiert, bis die Daten verfügbar sind. Teil 9

waitReasonGCWorkerIdleGC-Worker (untätig)

waitReasonPreempted preempteddebug call
waitReasonDebugCall
  • waitReasonWaitForGCCycle: Warten auf den GC-Zyklus, er geht in den Ruhezustand und verursacht eine Blockierung.
  • waitReasonGCWorkerIdle: Wenn der GC-Worker inaktiv ist, schläft er und führt zu Blockierungen.
  • waitReasonPreempted: Wenn eine zyklische Anrufunterbrechung auftritt, wird dieser in den Ruhezustand versetzt und auf die Planung gewartet.
  • waitReasonDebugCall: Wird ausgelöst, wenn GODEBUG aufgerufen wird.

Zusammenfassung

Der heutige Artikel ist eine Ergänzung zur ausführlichen Erklärung der runtime.gopark-Funktion am Anfang. Wir können ihre auslösenden Faktoren verstehen.

Die Hauptszenen sind:

  1. Kanal.
  2. Garbage Collection (GC).
  3. Schlaf.
  4. Schloss wartet.
  5. Preempted.
  6. IO-Blockierung (IO Wait)
  7. Andere, wie zum Beispiel: Panik, Finalizer, Auswahl usw.

Wir können diese Eigenschaften nutzen, um die Ursachen zu beseitigen, die zu Blockaden führen können. Tatsächlich besteht keine Notwendigkeit, sich daran zu erinnern, da es Faktoren gibt, die den Kontrollfluss beeinflussen, was zum Aufruf von Gopark führt.

Das obige ist der detaillierte Inhalt von27 Gründe, warum Goroutine hängt. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:Golang菜鸟. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen