Der Code demonstriert eine Semaphor-Implementierung in Go unter Verwendung eines gepufferten Kanals. Der Semaphor wird mit einer Kapazität von 10 erstellt, was maximal 10 gleichzeitige Prozesse erlaubt. Die Hauptfunktion iteriert 1000 Mal und sendet in jeder Iteration eine ganze Zahl an den Semaphor-Kanal. Wenn der Kanal voll ist, wird die Schleife blockiert, bis ein Wert aus dem Kanal freigegeben wird. Für jede Iteration wird eine neue Goroutine gestartet, die eine Startmeldung ausgibt und dann für eine zufällige Dauer zwischen 0 und 20 Sekunden schläft. Wenn die Goroutine fertig ist, gibt sie einen Wert aus dem Semaphor-Kanal frei und macht ihn für die nächste Iteration verfügbar. Das Freigeben des Werts erfolgt über die Anweisung `<- sem`, die auch den ursprünglichen Wert abruft, der an den Kanal gesendet wurde. Das Programm gibt Start- und Endmeldungen für jeden Prozess aus, einschließlich der Prozess-ID und der Dauer, die er zur Fertigstellung benötigt hat. Die Ausgabe zeigt, dass die Prozesse gleichzeitig ausgeführt werden, wobei maximal 10 Prozesse gleichzeitig laufen. Das Programm verwendet die Pakete `time` und `math/rand`, um Zufälligkeit in die Schlafdauer einzuführen.
dev.to
Implement semaphore in golang by buffered channel
