Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Kebuntuan Boleh Berlaku dalam Saluran Go dan Cara Menyahpepijatnya?

Bagaimanakah Kebuntuan Boleh Berlaku dalam Saluran Go dan Cara Menyahpepijatnya?

Patricia Arquette
Patricia Arquetteasal
2024-10-30 15:16:02739semak imbas

How Can Deadlocks Occur in Go Channels and How to Debug Them?

Go Channels dan Deadlocks

Dalam Go, saluran digunakan untuk berkomunikasi antara goroutine. Walau bagaimanapun, jika saluran tidak dikendalikan dengan betul, kebuntuan boleh berlaku.

Pertimbangkan kod berikut:

<code class="go">func main() {
  c1 := make(chan int)
  c2 := make(chan int)

  go func() {
    for i := range c1 {
      println("G1 got", i)
      c2 <- i
    }
  }()

  go func() {
    for i := range c2 {
      println("G2 got", i)
      c1 <- i
    }
  }()

  c1 <- 1

  time.Sleep(1000000000 * 50)
}</code>

Kod ini mencetak nombor tanpa had sehingga fungsi utama keluar. Walau bagaimanapun, jika kami menghantar nilai lain ke salah satu saluran daripada fungsi utama, program menyekat:

<code class="go">func main() {
  c1 := make(chan int)
  c2 := make(chan int)

  go func() {
    for i := range c1 {
      println("G1 got", i)
      c2 <- i
    }
  }()

  go func() {
    for i := range c2 {
      println("G2 got", i)
      c1 <- i
    }
  }()

  c1 <- 1

  time.Sleep(1000000000 * 1)

  c1 <- 2

  time.Sleep(1000000000 * 50)
}</code>

Ini berlaku kerana goroutine kedua tidak pernah menerima nilai "2" yang dihantar ke c1. Sebab kebuntuan ini ialah kedua-dua gorout sedang menunggu antara satu sama lain untuk menghantar dan menerima nilai, mewujudkan kebergantungan bulat.

Menyahpepijat Kebuntuan

Untuk nyahpepijat kebuntuan, beberapa pendekatan boleh digunakan:

  • OS seperti Unix: Gunakan perintah kill -6 [pid] untuk mematikan atur cara dan mencetak surih tindanan bagi setiap goroutine.
  • gdb: Lampirkan gdb pada proses dan periksa tindanan dan pembolehubah goroutine aktif.

Atas ialah kandungan terperinci Bagaimanakah Kebuntuan Boleh Berlaku dalam Saluran Go dan Cara Menyahpepijatnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn