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