Junior — Middle
Είναι δυνατή η θέσπιση ορίου στον αριθμό των ταυτόχρονων νημάτων εργασίας στη γλώσσα Go;
sobes.tech AI
Απάντηση από AI
Στη γλώσσα Go, δεν υπάρχει ενσωματωμένος μηχανισμός για άμεσο περιορισμό του αριθμού των goroutines (ελαφρών νημάτων) που λειτουργούν ταυτόχρονα. Μπορεί να υπάρχουν πολλές goroutines, και είναι ελαφριές. Για να περιορίσετε τον αριθμό των goroutines που εκτελούνται ταυτόχρονα, συνήθως χρησιμοποιούνται σημαφόροι ή κανάλια με περιορισμένη χωρητικότητα.
Παράδειγμα περιορισμού του αριθμού των goroutines που λειτουργούν ταυτόχρονα με τη χρήση καναλιού:
package main
import (
"fmt"
"sync"
"time"
)
func worker(id int, sem chan struct{}, wg *sync.WaitGroup) {
defer wg.Done()
sem <- struct{}{} // Κράτηση θέσης
fmt.Printf("Εργάτης %d ξεκίνησε\n", id)
time.Sleep(time.Second) // Εργασία
fmt.Printf("Εργάτης %d τελείωσε\n", id)
<-sem // Απελευθέρωση θέσης
}
func main() {
const maxConcurrent = 3
sem := make(chan struct{}, maxConcurrent) // Κανάλι με περιορισμό
var wg sync.WaitGroup
for i := 1; i <= 10; i++ {
wg.Add(1)
go worker(i, sem, &wg)
}
wg.Wait()
}
Εδώ, το κανάλι sem με buffer maxConcurrent περιορίζει τον αριθμό των goroutines που λειτουργούν ταυτόχρονα σε 3.