Sobes.tech
Junior — Middle

Go dilində müxtəlif goroutine'lar arasında icra dəyişimi necə həyata keçirilir?

sobes.tech Süni İntellekt

AI-dan cavab

Go dilində, goroutinlar arasında icra dəyişimi Go runtime planlayıcısı tərəfindən həyata keçirilir və bu, M:N modelini tətbiq edir — goroutinların (M) sistem iplikləri (N) üzərində planlaşdırılması.

Go planlayıcısı kooperativ və preemptiv işləyir:

  • Bir goroutine açıq şəkildə runtime.Gosched() çağıraraq idarəni verə bilər, bu da digər goroutinların icrasına imkan verir.
  • Planlayıcı müəyyən nöqtələrdə (məsələn, bloklayan əməliyyatlar, sistem çağırışları, giriş-çıxış əməliyyatları) goroutinı dayandıra bilər.
  • Go runtime avtomatik olaraq konteksti dəyişir və onların vəziyyətini (yığın, qeydiyyatlar) saxlayır.

Beləliklə, goroutinlar arasında keçid Go runtime daxilində baş verir və proqramçı adətən bunu birbaşa idarə etmir.

Açıq idarəetmə ötürülməsi nümunəsi:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // digər goroutinlara keçid
    }
}

func main() {
    go goroutine1()
    for i := 0; i < 5; i++ {
        fmt.Println("Əsas goroutine -", i)
    }
}

Burada, runtime.Gosched() digər goroutinlara keçməyə imkan verir.