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
Lepaskan: 2024-10-30 15:16:02
asal
738 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan