Sobes.tech
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.