Sobes.tech
Senior

Erzählen Sie mir vom Semaphore-Muster.

sobes.tech KI

Antwort von AI

Das Semaphore-Muster ist ein Synchronisationsmechanismus, der die Anzahl gleichzeitig ausgeführter Operationen oder den Zugriff auf eine Ressource einschränkt.

In Go kann ein Semaphor mit Hilfe eines Kanals implementiert werden, der die Anzahl der Goroutinen begrenzt, die gleichzeitig einen kritischen Abschnitt ausführen können.

Beispiel für einen einfachen Semaphor in Go:

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	sem := make(chan struct{}, 3) // Semaphor mit Kapazität 3
	var wg sync.WaitGroup

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			sem <- struct{}{} // Semaphor ergreifen
			fmt.Printf("Goroutine %d hat die Arbeit begonnen\n", id)
			time.Sleep(1 * time.Second) // Arbeit simulieren
			fmt.Printf("Goroutine %d hat die Arbeit beendet\n", id)
			<-sem // Semaphor freigeben
		}(i)
	}

	wg.Wait()
}

In diesem Beispiel können maximal drei Goroutinen gleichzeitig arbeiten. Semaphore sind nützlich, um Parallelität zu begrenzen, z.B. bei der Arbeit mit begrenzten Ressourcen (Verbindungen, Dateien usw.).