goroute dengan pilihan Tidak Berhenti Tanpa fmt.Print()
Dalam latihan Go Tour #71, goroute dengan pernyataan pilihan dilaksanakan secara berterusan melainkan pernyataan fmt.Print() ditambah dalam kes lalai. Tingkah laku ini timbul disebabkan oleh operasi select yang diubah apabila kenyataan lalai hadir.
Tanpa lalai, pilih blok sehingga mesej diterima pada mana-mana saluran yang dipantau. Dengan menambahkan lalai, pilih melaksanakan cawangan lalai apabila tiada saluran mempunyai mesej.
Dalam kod asal, pernyataan lalai mencipta gelung tak terhingga:
for { select { case todo := <-toDoList: ... case <-doneCrawling: ... default: if os.Args[1] == "ok" { fmt.Print("") } if crawling == 0 { goto END } } }
Tanpa fmt. Print() dalam lalai, penjadual tidak boleh menjadualkan goroutine lain, mengakibatkan kebuntuan. Menambah fmt.Print() membolehkan penjadual meneruskan fungsi normalnya, membolehkan penyiapan goroutine.
Mengubah suai kod untuk menggunakan pilihan bukan menyekat menyelesaikan isu:
for { select { case todo := <-toDoList: ... case <-doneCrawling: ... } if crawling == 0 { break } }
Sebagai alternatif, kod asal boleh dibuat untuk berfungsi dengan menetapkan GOMAXPROCS=2, menunjukkan masalah dengan beban berlebihan penjadual.
Atas ialah kandungan terperinci Mengapakah Penyata `select` Go Perlu `fmt.Print()` untuk Ditamatkan dalam Goroutine Tertentu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!