Sobes.tech
Junior — Middle

Πώς συμπεριφέρεται ένα πρόγραμμα στη γλώσσα Go όταν ορίζεται το GOMAXPROCS = 1 και ξεκινά μια goroutine με άπειρο βρόχο, αν ταυτόχρονα προσπαθήσετε να εκτελέσετε ένα άλλο μέρος του κώδικα;

sobes.tech AI

Απάντηση από AI

Ορίζοντας GOMAXPROCS=1 σε ένα πρόγραμμα Go, περιορίζεται ο αριθμός των συστημικών νημάτων που μπορούν να λειτουργούν ταυτόχρονα σε ένα. Αν ξεκινήσετε μια goroutine με έναν άπειρο βρόχο χωρίς να καλέσετε λειτουργίες που επιτρέπουν στον προγραμματιστή να αλλάξει το πλαίσιο (π.χ., time.Sleep, runtime.Gosched), αυτή η goroutine θα καταλάβει το μοναδικό νήμα και θα μπλοκάρει την εκτέλεση άλλων goroutines.

Ως αποτέλεσμα, ένα άλλο μέρος του κώδικα που τρέχει σε άλλες goroutines δεν θα μπορεί να εκτελεστεί παράλληλα και θα περιμένει μέχρι ο άπειρος βρόχος να παραδώσει τον έλεγχο. Αυτό συμβαίνει επειδή ο προγραμματιστής goroutine της Go, σε επίπεδο χρήστη, αλλάζει την εκτέλεση μεταξύ των goroutines, αλλά με GOMAXPROCS=1 υπάρχει μόνο ένα νήμα του λειτουργικού συστήματος, και αν η goroutine δεν επιτρέπει στον προγραμματιστή να αλλάξει, οι άλλες μπλοκάρονται.

Παράδειγμα:

package main

import (
	"fmt"
	"runtime"
	"time"
)

func main() {
	runtime.GOMAXPROCS(1)

	go func() {
		for {
			// άπειρος βρόχος χωρίς yield
		}
	}()

	time.Sleep(time.Second) // δίνουμε χρόνο στη goroutine να ξεκινήσει

	fmt.Println("Άλλο μέρος του κώδικα") // μπορεί να μην εκτελεστεί ποτέ
}

Για να αποφύγετε το μπλοκάρισμα, στον άπειρο βρόχο πρέπει να εισάγετε κλήσεις που επιτρέπουν στον προγραμματιστή να αλλάξει το πλαίσιο, όπως runtime.Gosched() ή time.Sleep.