Wie zu warten, bis gepufferten Kanal (semaphore) leer ist?

Habe ich eine Scheibe von ganzen zahlen, die manipuliert werden, die gleichzeitig:

ints := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

Ich bin mit einer gepufferten Kanal als semaphore, um eine Obere Grenze der gleichzeitig ausgeführten go-Routinen:

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)
}

Den code oben funktioniert ziemlich gut, bis der Letzte oder die letzten zwei ganze zahlen werden erreicht, weil das Programm endet, bevor die letzten gehen-Routinen sind abgeschlossen.

Frage: wie ich warten Sie für den gepufferten Kanal ablassen?

  • Du musst einen mutex verwenden oder so etwas. Die gepufferten Kanal blockiert, wenn er voll ist, aber es gibt keine Sprache-Funktion zu blockieren, bis es leer ist.
InformationsquelleAutor Kiril | 2016-09-29
Schreibe einen Kommentar