Go 取消上下文。是否多次取消上下文?
我正在使用Go 取消上下文。是否多次取消上下文?,go,goroutine,cancellation,tui,Go,Goroutine,Cancellation,Tui,我正在使用Go中的控制台音乐播放器。每当用户选择并播放一张专辑时,我都会在播放列表上启动一个goroutine到循环 playlist := make([]*Media, 0) for _, path := range album.Paths { media, err := NewMediaFromPath(path) // return err playlist = append(playlist, media) } for idx := range playlis
Go
中的控制台音乐播放器。每当用户选择并播放一张专辑时,我都会在播放列表上启动一个goroutine到循环
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()
}
}
当用户选择一张新专辑时,我需要一种方法来取消这个goroutine。我使用的是context.context
(但我不认为这是最好的解决方案)
我创建了ctx
ctx, cancel := context.WithCancel(context.Background())
因此,在UI事件处理程序中,play()
func
将cancel()
goroutine
当我检查更新UI中的循环时,这会起作用:
select {
case <-ctx.Done():
return err
default:
time.Sleep(50 * time.Millisecond)
}
但是我得到了一个sync:WaitGroup被重用,在之前的等待返回之前
panic使用通道取消goroutine怎么样
select {
case <-chClose:
return
default:
}
但是你不能再关上它!所以你需要确保你的新专辑有一个新的结尾。根据您的代码结构,这可能是更干净的解决方案
或者,您只需在chClose上发送一个值,即可启动停止go例程:
chClose <- 1
chClose您需要一个干净的体系结构!!)
close(chClose)
chClose <- 1