Sobes.tech
Junior — Middle

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.