Planlaşdırıcı, goroutine-in icra etməsini məcbur etməyəcəkmi?
sobes.tech Süni İntellekt
AI-dan cavab
Go dilində, goroutine planlayıcısı (scheduler) adətən goroutine-lər arasında keçidi idarə edir ki, eyni vaxtda işləmə təmin olunsun. Ancaq, uzunmüddətli sinxron əməliyyat həyata keçirən və planlayıcıyı çağıran funksiyaları çağırmayan goroutine vəziyyəti mümkündür (məsələn, sistem çağırışları, giriş/çıxış əməliyyatları və ya runtime.Gosched() çağırışı).
Bu, Go-nun goroutine səviyyəsində kooperativ çoxlu tapşırıq istifadə etməsindən irəli gəlir: keçid müəyyən nöqtələrdə, məsələn, bloklayan əməliyyatlar və ya runtime.Gosched() çağırışında baş verir. Əgər goroutine bu nöqtələr olmadan sonsuz dövr icra edirsə, o, planlayıcıyı «bloke» edə bilər və digər goroutine-lərə nəzarəti ötürməz.
Nümunə:
for {
// əgər burada planlayıcıya keçid edə biləcək çağırışlar yoxdursa,
// goroutine digər goroutine-lərin icrasını dayandıra bilər
}
Bu səbəbdən, planlayıcının goroutine-lər arasında keçid etməsinə imkan vermək üçün runtime.Gosched() çağırışlarını əlavə etmək və ya kanallar/bloklayan əməliyyatlar istifadə etmək tövsiyə olunur.