利用 context.WithCancel()来终止协程,但存在一个问题:cancel()执行后,必须等 for 循环执行完毕 goroutine 才退出。
for {
select {
case <-Ctx.Done():
return
default:
for i := 0; i < 100; i++ {
// 业务逻辑
}
}
}
需求为:cancel()后协程立马退出不再执行后面的循环。
目前我的解决方法:单独起一个协程用来监听退出信号,然后通过全局变量通知业务逻辑循环退出。
flag := false
go func() {
for {
select {
case <-Ctx.Done():
flag = true
return
}
}()
for i:=0; i < 100; i++ {
if flag {
return
}
// 业务逻辑
}
请问最佳实践应该是如何退出?