Sobes.tech
Junior — Middle

Πώς καθορίζεται το όριο του αριθμού των goroutines που τρέχουν ταυτόχρονα στη γλώσσα Go;

sobes.tech AI

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

Στη γλώσσα Go, δεν υπάρχει ενσωματωμένος μηχανισμός για άμεσο περιορισμό του αριθμού των 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("Goroutine %d ξεκίνησε\n", id)
    time.Sleep(time.Second) // προσομοίωση εργασίας
    fmt.Printf("Goroutine %d ολοκλήρωσε\n", id)
    <-sem // ελευθερώνει μια θέση
}

func main() {
    const maxGoroutines = 3
    sem := make(chan struct{}, maxGoroutines) // κανάλι με buffer περιορίζει τον αριθμό των goroutines
    var wg sync.WaitGroup

    for i := 1; i <= 10; i++ {
        wg.Add(1)
        go worker(i, sem, &wg)
    }
    wg.Wait()
}

Σε αυτό το παράδειγμα, το κανάλι sem με buffer maxGoroutines περιορίζει τον αριθμό των goroutines που τρέχουν ταυτόχρονα. Κάθε goroutine, πριν ξεκινήσει να εργάζεται, τοποθετεί μια κενή δομή στο κανάλι, καταλαμβάνοντας μια θέση, και την ελευθερώνει μετά το τέλος. Με αυτόν τον τρόπο, δεν θα τρέχουν περισσότερες από maxGoroutines goroutines ταυτόχρονα.