Senior
Mesélj a Semaphore mintáról.
sobes.tech MI
Válasz az MI-től
A Semaphore (szemafor) mintázat egy szinkronizációs mechanizmus, amely korlátozza az egyidejűleg végrehajtott műveletek számát vagy az erőforráshoz való hozzáférést.
Go-ban a szemafort csatorna segítségével lehet megvalósítani, korlátozva a kritikus szekciót egyszerre végrehajtó gorutinok számát.
Egyszerű szemafor példája Go-ban:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
sem := make(chan struct{}, 3) // 3 kapacitású szemafor
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // szemafor megszerzése
fmt.Printf("Gorutina %d munkába kezdett\n", id)
time.Sleep(1 * time.Second) // munka szimuláció
fmt.Printf("Gorutina %d befejezte a munkát\n", id)
<-sem // szemafor felszabadítása
}(i)
}
wg.Wait()
}
Ebben a példában legfeljebb három gorutina végezhet munkát egyszerre. A szemafor hasznos a párhuzamosság korlátozására, például korlátozott erőforrások (kapcsolatok, fájlok stb.) esetén.