Goroutine Menyekat Goroutine Lain
Dalam coretan kod yang diberikan, goroutine pertama memasuki gelung tak terhingga, menyekat baki goroutine daripada dihantar ke saluran tamat masa. Tingkah laku ini ialah ciri penjadualan koperasi dalam goroutine.
Gorutin menghasilkan penjadual dalam senario berikut:
Dalam kes ini, gelung tak terhingga dalam goroutine pertama menghalangnya daripada menyerah kepada penjadual. Oleh itu, goroutine yang lain tidak boleh menghantar ke saluran tamat masa dan program terus berjalan selama-lamanya dan bukannya ditamatkan selepas satu saat.
Satu penyelesaian yang berpotensi untuk isu ini ialah menggunakan penjadual preemptive dan bukannya penjadual koperasi. Dalam penjadual preemptive, sistem bertukar secara paksa antara goroutine berdasarkan keutamaannya. Walau bagaimanapun, Go pada masa ini menggunakan penjadual koperasi.
Strategi lain ialah dengan menyerahkan secara manual kepada penjadual menggunakan masa jalan.Gosched(). Walau bagaimanapun, teknik ini secara amnya tidak diperlukan dalam kebanyakan program kerana komunikasi yang mencukupi melalui saluran atau sistem I/O.
Adalah penting untuk ambil perhatian bahawa menetapkan GOMAXPROCS kepada nilai yang lebih tinggi mungkin tidak menyelesaikan isu sepenuhnya. Walaupun ia membenarkan berbilang goroutin berjalan selari, pemungut sampah masih beroperasi secara serentak. Jika goroutin CPU yang tinggi tidak pernah menghasilkan, GC boleh menyekat goroutin lain selama-lamanya semasa berjalan.
Atas ialah kandungan terperinci Mengapa Goroutine Menyekat Satu Sama Lain, dan Bagaimana Ini Boleh Diatasi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!