Rumah >pembangunan bahagian belakang >Golang >Bolehkah Goroutine Berlari Secara Berterusan Mematikan Goroutine Lain dalam Go?

Bolehkah Goroutine Berlari Secara Berterusan Mematikan Goroutine Lain dalam Go?

Susan Sarandon
Susan Sarandonasal
2024-12-09 06:52:06243semak imbas

Can Continuously Running Goroutines Starve Other Goroutines in Go?

Penjadualan Koperasi Goroutine dan Potensi Kebuluran Pelaksanaan

Goroutine dijadualkan secara kooperatif, bermakna mereka secara sukarela menyerahkan pelaksanaan kepada goroutin lain. Walaupun pendekatan ini secara amnya memastikan keadilan, ia menimbulkan persoalan sama ada gorouti yang mengelak daripada menghasilkan berpotensi menyebabkan kebuluran gorouti lain.

Menurut catatan blog yang dirujuk (http://blog.nindalf.com/how-goroutines -work/), goroutin yang gelung berterusan tanpa menghasilkan memang boleh menyebabkan gorouti lain kelaparan pada benang yang sama. Goroutine pada utas tertentu dimultipleks, bermakna mereka tidak menyekat utas walaupun menghadapi operasi menyekat seperti input rangkaian, tidur atau operasi saluran.

Sebagai contoh, fungsi "jumlah" dalam kod yang diberikan berulang kali gelung beberapa kali rawak, menambah nombor pada jumlah dan mencetak hasil akhir. Jika berbilang goroutin tersebut dihasilkan menggunakan kata kunci "go" (seperti yang ditunjukkan dalam contoh), sama ada ia dilaksanakan satu demi satu bergantung pada faktor berikut:

  • Bilangan utas yang tersedia (GOMAXPROCS ): Jika GOMAXPROCS ditetapkan kepada 1, semua gorout akan dilaksanakan secara berurutan pada satu utas, menghasilkan kebuluran.
  • Mata hasil: Dalam fungsi jumlah, tiada panggilan fungsi atau primitif penyegerakan yang membolehkan goroutine menghasilkan. Akibatnya, goroutine akan menahan benang sehingga ia selesai.
  • Perubahan masa jalan terbaharu: Catatan blog yang dipetik sudah lapuk sedikit. Versi baharu masa jalan Go mungkin menjadualkan penukaran goroutine walaupun untuk fungsi tanpa titik hasil yang jelas, seperti "fmt.Println". Ini dilakukan untuk mengelakkan potensi kebuluran.

Oleh itu, jika tiada hasil nyata atau panggilan fungsi yang mencetuskan penjadualan, goroutin yang melaksanakan gelung tak terhingga berpotensi menyebabkan kebuluran gorout lain pada urutan yang sama. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa masa jalan Go secara aktif cuba mengimbangi pelaksanaan goroutine dan mencegah kebuluran.

Atas ialah kandungan terperinci Bolehkah Goroutine Berlari Secara Berterusan Mematikan Goroutine Lain dalam Go?. 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