Ich habe eine Scheibe von ganzen Zahlen, die gleichzeitig manipuliert werden:Warten, bis der gepufferte Kanal (Semaphor) leer ist?
ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
Ich verwende einen gepufferten Kanal als Semaphor, um eine eine obere Grenze von gleichzeitig laufenden Go-Routinen zu haben:
sem := make(chan struct{}, 2)
for _, i := range ints {
// acquire semaphore
sem <- struct{}{}
// start long running go routine
go func(id int, sem chan struct{}) {
// do something
// release semaphore
<- sem
}(i, sem)
}
Der obige Code funktioniert ziemlich gut, bis die letzten oder letzten zwei Ganzzahlen erreicht sind, weil das Programm endet, bevor diese letzten Routinen beendet sind.
Frage: Wie warte ich, bis der gepufferte Kanal abfließt?
Du musst ein Mutex oder etwas verwenden. Der gepufferte Kanal blockiert, wenn er voll ist, aber es gibt keine Sprachfunktion, die blockiert werden kann, bis sie leer ist. – evanmcdonnal