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
Logo |
Bedeutung: | waitReasonSelect
select |
| waitReasonSelectNoCases
select (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 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
waitReasonFinalizerWaitfinalizer 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
preempted
|
waitReasonDebugCall |
debug call
- 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:
- 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!