Goroutine Infinite Loop Menyekat Pelayan HTTP dalam Go
Bahasa pengaturcaraan Go membolehkan penciptaan goroutin serentak yang berjalan selari. Walau bagaimanapun, pemerhatian baru-baru ini telah menimbulkan kebimbangan tentang kelakuan goroutin gelung tak terhingga dalam pelayan HTTP.
Menurut dokumentasi Go, menetapkan masa jalan.GOMAXPROCS(8) dengan 8 teras CPU harus membenarkan gorouti berjalan selari tanpa menghalang satu sama lain. Walau bagaimanapun, ini tidak berlaku apabila menggunakan pakej net/http. Goroutine gelung tak terhingga nampaknya menyekat pelayan selepas beberapa permintaan.
Isu ini tidak terhad kepada kod, kerana ia berterusan walaupun masa jalan.LockOSThread() ditambahkan pada goroutin gelung tak terhingga. Ini adalah tidak dijangka kerana masa jalan.LockOSThread() harus memastikan bahawa gelung berjalan dalam urutan yang berasingan, membebaskan gorout lain untuk terus melaksanakan.
Penjelasan
Waktu jalan Go penjadual bukanlah pre-emptive sepenuhnya. Sekiranya tiada panggilan fungsi, seperti dalam kes kod gelung tak terhingga, penjadual tidak dicetuskan. Ini membolehkan goroutine gelung tak terhingga memonopoli CPU dan menghalang gorout lain daripada dilaksanakan.
Penyelesaian
Terdapat beberapa penyelesaian yang mungkin untuk isu ini:
Adalah penting untuk ambil perhatian bahawa masa jalan.LockOSThread() tidak mengasingkan gelung sepenuhnya dalam urutan berasingan. Ia membenarkan gelung berjalan pada mana-mana urutan, tetapi penjadual mungkin masih mengganggunya jika gorout lain memerlukan pelaksanaan.
Atas ialah kandungan terperinci Mengapa Infinite-Loop Goroutines Menyekat Pelayan HTTP Go Walaupun `runtime.GOMAXPROCS` dan `runtime.LockOSThread()`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!