Ich arbeite an einem Konsolen-Musik-Player in Go
. Immer wenn der Benutzer ein Album auswählt und wiedergibt, starte ich eine Goroutine zu Schleife über eine Wiedergabeliste.Abbrechen eines context.Context mehr als einmal?
playlist := make([]*Media, 0)
for _, path := range album.Paths {
media, err := NewMediaFromPath(path)
// return err
playlist = append(playlist, media)
}
for idx := range playlist {
player.SetMedia(playlist[idx])
err = player.Play()
// check err
status, err := player.MediaState()
// check err
for status != MediaEnded && status != MediaStopped {
// update UI and check player status
// loop until the song finishes
status, err = player.MediaState()
}
}
Ich brauche einen Weg Cancelling dieses goroutine, wenn der Benutzer ein neues Album auswählt. Ich benutze context.Context
, um dies zu tun (aber ich bin nicht überzeugt, dass es die beste Lösung ist).
Ich schaffe das ctx
ctx, cancel := context.WithCancel(context.Background())
So im UI-Event-Handler, die play()
func
die goroutine cancel()
.
Dies funktioniert, wenn ich in der Update UI überprüfen for
Schleife:
select {
case <-ctx.Done():
return err
default:
time.Sleep(50 * time.Millisecond)
}
Dann wird der Kanal ctx.Done()
geschlossen ist und die nächsten Alben gespielt wird immer statt Schleife zurück.
Gibt es eine Möglichkeit, eine context.Context
zu annullieren?
Wenn nicht, gibt es eine bessere Möglichkeit, diese Goroutine (und die folgenden Goroutines) abzubrechen?
Alternativ habe ich versucht, waitgroups zu verwenden,
go func() {
wg.Wait()
wg.Add(1)
err = playAlbum(
done,
player,
*albums[s],
list,
status,
)
wg.Done()
// handle err
}()
Aber dann bekomme ich eine Panik