Senior
Papaskink man apie Semaphore modelį.
sobes.tech AI
Atsakymas iš AI
Semaphore (semaforas) yra sinchronizacijos mechanizmas, kuris riboja vienu metu vykdomų operacijų skaičių arba prieigos prie ištekliaus skaičių.
Go kalboje semaphore galima įgyvendinti naudojant kanalą, kuris riboja vienu metu vykdančių gorutinų skaičių, galinčių vykdyti kritinę sekciją.
Paprastas semaphore pavyzdys Go kalboje:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
sem := make(chan struct{}, 3) // semaphore su talpa 3
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer wg.Done()
sem <- struct{}{} // semaforo įsigijimas
fmt.Printf("Gorutina %d pradėjo darbą\n", id)
time.Sleep(1 * time.Second) // darbo imitacija
fmt.Printf("Gorutina %d baigė darbą\n", id)
<-sem // semaforo paleidimas
}(i)
}
wg.Wait()
}
Šiame pavyzdyje vienu metu gali dirbti ne daugiau kaip trys gorutinos. Semaphore yra naudingas norint apriboti paralelizmą, pavyzdžiui, dirbant su ribotais ištekliais (ryšiais, failais ir kt.).