Sobes.tech
Junior — Middle

Go dilinde farklı goroutine'ler arasında yürütme değişimi nasıl gerçekleştirilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go dilinde, goroutine'lar arasındaki yürütme değişimi, M:N modelini uygulayan Go çalışma zamanı planlayıcısı tarafından gerçekleştirilir — bir dizi goroutine (M), sistem iplikleri (N) üzerinde planlanır.

Go planlayıcısı kooperatif ve öncelikli çalışma yapar:

  • Bir goroutine, runtime.Gosched() çağrısı yaparak açıkça kontrolü devredebilir, bu da diğer goroutine'ların çalışmasına izin verir.
  • Planlayıcı, belirli noktalarda (örneğin, engelleyici işlemler, sistem çağrıları, giriş/çıkış işlemleri sırasında) bir goroutine'yi durdurabilir.
  • Go çalışma zamanı, goroutine'ler arasında otomatik olarak bağlam değiştirir ve durumlarını (yığın, kayıtlar) kaydeder.

Bu nedenle, goroutine'ler arasındaki geçiş, Go çalışma zamanı içinde gerçekleşir ve programcı genellikle bunu doğrudan kontrol etmez.

Açık kontrol devri örneği:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // diğer goroutine'lara geçiş yap
    }
}

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

Burada, runtime.Gosched() diğer goroutine'lara geçişi sağlar.