Sobes.tech
Junior — Middle

როგორ ხორციელდება შესრულების შეცვლა სხვადასხვა goroutine-ებს შორის Go ენისთვის?

sobes.tech AI

პასუხი AI-სგან

Go ენის ფარგლებში, გორუტინებს შორის შესრულების ცვლილება ხდება Go runtime-ის დაგეგმვის მეშვეობით, რომელიც ახორციელებს M:N მოდელს — გორუტინების (M), რომლებიც დაგეგმილია სისტემის ნაკადებზე (N).

Go-ის დაგეგმვა მუშაობს კოოპერატიულად და პრეემპტიულად:

  • გორუტინა შეიძლება გამიზნულად გადმოსცეს კონტროლი runtime.Gosched()-ის გამოძახებით, რაც საშუალებას აძლევს სხვა გორუტინებს შესრულებას.
  • დაგეგმვა შეიძლება გაჩერდეს გორუტინზე გარკვეულ წერტილებში (მაგალითად, ბლოკირებადი ოპერაციების, სისტემური ზარების, შესვლის/გამოსვლის ოპერაციების დროს).
  • Go runtime ავტომატურად იცვლის კონტექსტს გორუტინებს შორის, ინახავს მათ მდგომარეობას (სტეკი, რეგისტრები).

ამ გზით, გორუტინებს შორის გადართვა ხდება Go runtime-ის შიგნით, და პროგრამისტი ჩვეულებრივ, ამას პირდაპირ არ აკონტროლებს.

გამოყენების მაგალითი:

goroutine1 := func() {
    for i := 0; i < 5; i++ {
        fmt.Println("Goroutine 1 -", i)
        runtime.Gosched() // გადაცემის სხვა გორუტინებს
    }
}

func main() {
    go goroutine1()
    for i := 0; i < 5; i++ {
        fmt.Println("ძირითადი გორუტინა -", i)
    }
}

აქ, runtime.Gosched() საშუალებას აძლევს სხვა გორუტინებს გადასვლას.