Junior — Middle
Πώς πραγματοποιείται η αλλαγή εκτέλεσης μεταξύ διαφορετικών goroutines στη γλώσσα Go;
sobes.tech AI
Απάντηση από AI
Στη γλώσσα προγραμματισμού Go, η αλλαγή εκτέλεσης μεταξύ goroutines πραγματοποιείται από το scheduler του runtime Go, που υλοποιεί το μοντέλο M:N — ένα σύνολο goroutines (M) που προγραμματίζονται σε ένα σύνολο συστημικών νημάτων (N).
Ο scheduler του Go λειτουργεί συνεργατικά και προληπτικά:
- Μια goroutine μπορεί ρητά να παραδώσει τον έλεγχο καλώντας
runtime.Gosched(), επιτρέποντας σε άλλες goroutines να εκτελεστούν. - Ο scheduler μπορεί να διακόψει μια goroutine σε συγκεκριμένα σημεία (π.χ., κατά την κλήση μπλοκαριστικών λειτουργιών, συστημικών κλήσεων, λειτουργιών εισόδου/εξόδου).
- Το runtime του Go αλλάζει αυτόματα το πλαίσιο μεταξύ των goroutines, αποθηκεύοντας την κατάσταση τους (στοίβα, καταχωρητές).
Έτσι, η μετάβαση μεταξύ goroutines συμβαίνει εντός του runtime του Go, και ο προγραμματιστής συνήθως δεν το ελέγχει άμεσα.
Παράδειγμα ρητής παράδοσης ελέγχου:
goroutine1 := func() {
for i := 0; i < 5; i++ {
fmt.Println("Goroutine 1 -", i)
runtime.Gosched() // παραδίδουμε τον έλεγχο σε άλλες goroutines
}
}
func main() {
go goroutine1()
for i := 0; i < 5; i++ {
fmt.Println("Κύρια goroutine -", i)
}
}
Εδώ, το runtime.Gosched() επιτρέπει τη μετάβαση σε άλλες goroutines.