GOMAXPROCS Ditetapkan kepada 2, Tetapi Program Kekal Terjejas
Walaupun menetapkan masa jalan.GOMAXPROCS(2), program menghadapi masalah penggantungan semasa mengeluarkan nombor . Walaupun penggunaan CPU yang tinggi diperhatikan, punca kerosakan itu masih sukar difahami.
Kod yang disediakan mempunyai dua goroutine: forever(), gelung sibuk dan show(), yang mencetak nombor dalam gelung yang tidak berkesudahan. Fungsi utama menetapkan GOMAXPROCS untuk menggunakan dua teras CPU. Walau bagaimanapun, program menjadi tidak bertindak balas.
Isu ini terletak pada operasi berterusan selama-lamanya(). Dengan berjalan secara berterusan, ia menggunakan seluruh rangkaian OS dan mengganggu penjadualan goroutine masa jalan. Dalam Go 1.5 secara khusus, ia menghalang fasa henti dunia pengumpulan sampah.
Untuk menyelesaikan masalah ini, gelung sibuk dalam forever() boleh digantikan dengan fungsi yang menghasilkan CPU dengan kerap. Sebagai alternatif, ia boleh dialih keluar sama sekali, kerana gelung tidak berkesudahan tidak diperlukan.
Sebagai contoh, mengubah suai forever() seperti berikut menyelesaikan masalah:
func forever() { for { runtime.Gosched() } }
Dengan memperkenalkan titik penjadualan ke dalam gelung, goroutine boleh melepaskan kawalan dan membenarkan goroutine lain untuk dilaksanakan. Ini memastikan semua goroutine, termasuk yang bertanggungjawab untuk fungsi teras, boleh berjalan dengan cekap.
Atas ialah kandungan terperinci Mengapa Program My Go Membeku Walaupun Menetapkan `runtime.GOMAXPROCS(2)`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!