Rumah  >  Artikel  >  pembangunan bahagian belakang  >  27 sebab mengapa Goroutine hang

27 sebab mengapa Goroutine hang

Golang菜鸟
Golang菜鸟ke hadapan
2023-08-08 16:25:34786semak imbas

Artikel hari ini akan berkongsi dengan anda 27 punca gopark. Untuk kemudahan membaca, kami akan menerangkan mengikut kategori. .
waitReasonGCAssistMarking

GC assist markingwaitReasonIOWait

IO tunggu
  • waitReasonZero: Tiada penjelasan rasmi, berdasarkan penggunaan. Terutamanya digunakan dalam dua senario: tidur dan kunci.
  • waitReasonGCAssistMarking: Fasa penandaan tambahan GC akan menyebabkan menunggu terhalang.
  • waitReasonIOTunggu: Apabila IO disekat dan menunggu, contohnya: permintaan rangkaian, dsb. . nil chan)

waitReasonChanSendNilChanchan hantar (nil chan)

  • waitReasonChanReceiveNilChan: Baca operasi pada saluran yang tidak dimulakan.
  • waitReasonChanSendNilChan: Tulis operasi ke saluran yang tidak dimulakan. . imbasan kutipan sampah

  • waitReasonDumpingHeap: Apabila membuang timbunan Go Heap, senario penggunaan ini hanya disekat semasa runtime.debug, iaitu jenis koleksi pprof biasa.
  • waitReasonGarbageCollection: Dicetuskan semasa kutipan sampah, senario utama ialah fasa Penamatan GC Mark.
  • waitReasonGarbageCollectionScan: Semasa pengimbasan kutipan sampah, senario utama dicetuskan apabila tanda GC (GC Mark) mengimbas peringkat Root. .

waitReasonSelectselect

waitReasonSelectNoCasesselect (tiada kes )
  • waitReasonPanicTunggu: Dicetuskan apabila panik berlaku dalam goroutine utama.
  • waitReasonSelect: Dicetuskan apabila memanggil kata kunci pilih.
  • waitReasonSelectNoCases: Apabila memanggil kata kunci pilih, jika tiada kes, ia akan dicetuskan secara langsung. .

tungguReasonGCScavengeWaitGC sapu tunggu

tungguReasonGCScavengeWait GC mengais tunggu
  • waitReasonGCAssistWait: Gelagat tamat dalam fasa tanda tambahan GC akan dicetuskan.
  • waitReasonGCSweepWait: Gelagat tamat dalam fasa sapuan GC akan dicetuskan.
  • waitReasonGCScavengeWait: Gelagat akhir fasa GC scavenge akan dicetuskan. GC Scavenge terutamanya pengumpulan sampah ruang baharu Ia adalah GC yang kerap berjalan dan pantas yang bertanggungjawab untuk membersihkan objek yang lebih kecil dari ruang baharu. .
tungguReasonChanSend

chan hantar

tungguReasonFinalizerTunggu
finalizer tunggu
  • waitReasonChanReceive: Operasi baca pada saluran akan dicetuskan.
  • waitReasonChanSend: Dicetuskan apabila menulis dalam saluran.
  • waitReasonFinalizerWait: akan dicetuskan apabila finalizer tamat. Dalam program Go, anda boleh menetapkan fungsi finalizer untuk objek dengan memanggil fungsi runtime.SetFinalizer. Tingkah laku ini sepadan dengan kitar semula yang disebabkan oleh fasa akhir. .

waitReasonSemacquiresemacquire

waitReasonSleep
tidur
  • waitReasonForceGCIdle: Dicetuskan apabila GC paksa (masa melahu) tamat.
  • waitReasonSemacquire: Dicetuskan apabila pemprosesan semaphore tamat.
  • waitReasonSleep: tingkah laku tidur klasik, akan dicetuskan. . ia

waitReasonTimerGoroutineIdle goroutine pemasa (terbiar)

waitReasonTraceReaderDisekatpembaca jejak (disekat)
  • waitReasonSyncCondWait: Dicetuskan apabila digabungkan dengan kaedah sync.Cond 用法能知道,是在调用 sync.Wait.
  • waitReasonTimerGoroutineIdle: berkaitan dengan Pemasa, ia akan dicetuskan apabila tiada pemasa untuk melaksanakan tugas.
  • waitReasonTraceReaderBlocked: Berkaitan dengan Trace, ReadTrace akan mengembalikan data surih binari dan akan menyekat sehingga data tersedia. . kitaran

tungguReasonGCWorkerIdlePekerja GC (terbiar)

tungguReasonPreempted dipreempteddebug call
waitReasonDebugCall
  • waitReasonWaitForGCCycle: Menunggu kitaran GC, ia akan tidur dan menyebabkan tersumbat.
  • waitReasonGCWorkerIdle: Apabila Pekerja GC melahu, ia akan tidur dan menyebabkan terhalang.
  • waitReasonPreempted: Apabila preemption panggilan kitaran berlaku, ia akan tidur dan menunggu penjadualan.
  • waitReasonDebugCall: Dicetuskan apabila GODEBUG dipanggil.

Ringkasan

Artikel hari ini adalah tambahan kepada penjelasan terperinci tentang fungsi runtime.gopark pada mulanya.

Adegan utama ialah:

  1. Saluran.
  2. Kutipan Sampah (GC).
  3. Tidur.
  4. Kunci menunggu.
  5. Didahulukan.
  6. IO menyekat (IO Tunggu)
  7. Lain-lain, seperti: panik, pemuktamad, pilih, dsb.

Kita boleh menggunakan ciri-ciri ini untuk membongkar sebab-sebab yang boleh menyebabkan penyumbatan. Malah, tidak perlu diingati mereka akan menyebabkan sekatan kerana ada faktor yang mempengaruhi aliran kawalan, yang akan membawa kepada panggilan gopark.

Atas ialah kandungan terperinci 27 sebab mengapa Goroutine hang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:Golang菜鸟. Jika ada pelanggaran, sila hubungi admin@php.cn Padam