Golang HTTP Server Menyekat Apabila Memulakan Goroutine Infinite-Loop
Soalan:
Kenapa melakukan blok pelayan HTTP Golang apabila goroutine gelung tak terhingga dimulakan, walaupun mempunyai berbilang benang dan goroutines tersedia disebabkan oleh masa jalan.GOMAXPROCS(8) sedang ditetapkan?
Penjelasan:
Isu ini berlaku kerana penjadual masa jalan Go tidak bersifat awalan sepenuhnya. Pada masa ini, penjadual hanya sekali-sekala memanggil ke dalam penjadual semasa panggilan fungsi. Walau bagaimanapun, gelung tak terhingga yang dipersoalkan tidak mempunyai sebarang panggilan fungsi, jadi penjadual tidak digunakan.
Rtime.LockOSThread() dan Kekurangan Pre-Emptiveness:
Fungsi runtime.LockOSThread() direka untuk melaksanakan goroutine yang digunakan pada yang berasingan benang, mengasingkannya daripada goroutin lain dan menghalangnya daripada menyekat benang utama. Walau bagaimanapun, dalam kes ini, walaupun runtime.LockOSThread() membantu kerana penjadual tidak cukup pre-emptive. Gelung tak terhingga terus menyekat gorouti lain, kerana penjadual tidak menukar urutan secara aktif.
Penyelesaian:
Untuk menyelesaikan isu ini, menggabungkan beberapa logik atau panggilan fungsi sebenar ke dalam gelung tak terhingga boleh membantu mencetuskan penjadual dengan lebih kerap. Sebagai alternatif, memanggil masa jalan secara eksplisit.Gosched() dalam gelung tak terhingga boleh memaksa penjadual menukar urutan, membenarkan gorout lain menyambung semula pelaksanaan.
Atas ialah kandungan terperinci Mengapa My Go HTTP Server Menyekat Apabila Goroutine Menjalankan Gelung Infinite?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!