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