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