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() საშუალებას აძლევს სხვა გორუტინებს გადასვლას.