Rumah >pembangunan bahagian belakang >Golang >Mengapa Infinite Go Routine Menyekat Goroutine Lain daripada Dihantar ke Saluran?

Mengapa Infinite Go Routine Menyekat Goroutine Lain daripada Dihantar ke Saluran?

Linda Hamilton
Linda Hamiltonasal
2024-12-04 16:52:11556semak imbas

Why Does an Infinite Go Routine Block Other Goroutines from Sending to Channels?

Go Routine Menyekat Orang Lain: Penjelasan Lebih Dalam

Dalam Go, kod berikut menunjukkan gelagat luar biasa di mana goroutine dengan gelung tak terhingga nampaknya menghalang mesej goroutine lain daripada mencapai yang dimaksudkan saluran:

func main() {
   timeout := make(chan int)
   go func() {
      time.Sleep(time.Second)
      timeout <- 1
    }()

    res := make(chan int)
    go func() {
        for {
        }
        res <- 1
    }()
    select {
        case <-timeout:
            fmt.Println("timeout")
        case <-res:
            fmt.Println("res")
    }
}

Daripada menamatkan selepas satu saat, atur cara memasuki gelung tak terhingga. Mengapa ini berlaku?

Memahami Penjadualan Koperasi dalam Go

Jawapannya terletak pada penggunaan penjadualan koperasi oleh Go untuk goroutin. Goroutines memberikan kawalan kepada penjadual di bawah syarat tertentu, termasuk:

  • Operasi penghantaran/terima saluran tidak dibuffer
  • Panggilan sistem (cth., fail/rangkaian I/O)
  • Peruntukan memori
  • masa.Sleep() panggilan
  • runtime.Gosched() calls

Memandangkan gelung tak terhingga dalam goroutine pertama tidak pernah menghasilkan, ia menghalang goroutine lain daripada berjalan dan menghantar mesej ke saluran. Ini termasuk saluran tamat masa, yang sedang menunggu mesej yang tidak akan tiba.

Potensi Penyelesaian

Walaupun penjadualan kerjasama boleh membawa kepada situasi sedemikian, terdapat penyelesaian yang berpotensi :

  • Meningkatkan GOMAXPROCS: Pembolehubah persekitaran ini membenarkan berbilang urutan untuk melaksanakan goroutin secara serentak, mengurangkan kemungkinan satu goroutine menyekat yang lain.
  • Menggunakan Penjadual Preemptive (Matlamat Masa Depan): Pembangun bahasa Go bertujuan untuk melaksanakan penjadual preemptive, yang akan secara paksa bertukar antara goroutine, menghapuskan isu menyekat.
  • Penghasilan Manual: Fungsi runtime.Gosched() membenarkan goroutines untuk menghasilkan kawalan secara manual kepada penjadual, memecahkan gelung tak terhingga yang mungkin menyekat orang lain.

Atas ialah kandungan terperinci Mengapa Infinite Go Routine Menyekat Goroutine Lain daripada Dihantar ke Saluran?. 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