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