如何停止可能是也可能不是 运行 的 goroutine?
how to stop a goroutine which may or may not be running?
我有一个 go func,如果 运行 默认为 运行 我想停止它。如果 go func 已经返回,下面的方法将在 quit <- true
处被阻止。
quit := make(chan bool)
go func() {
for {
select {
case <- quit:
return
default:
// Do other stuff and return if complete.
}
}
}()
// Do stuff
// Quit goroutine
quit <- true
关闭退出通道而不是发送值。循环将退出,因为在关闭的通道 returns 上接收到零值。
此外,将通道声明为 chan struct{}
以指示通道值对程序不重要:
quit := make(chan struct{})
go func() {
for {
select {
case <- quit:
return
default:
// Do other stuff and return if complete.
}
}
}()
// Do stuff
// Quit goroutine
close(quit)
如果您需要突破 "other stuff",请将退出通道传递给 "other stuff" 并时不时检查一下:
select {
case <- quit:
return
default:
}
... keep going
如果您所做的不仅仅是此答案中的第一个片段,那么您应该考虑使用标准 context 包来取消信号。
我有一个 go func,如果 运行 默认为 运行 我想停止它。如果 go func 已经返回,下面的方法将在 quit <- true
处被阻止。
quit := make(chan bool)
go func() {
for {
select {
case <- quit:
return
default:
// Do other stuff and return if complete.
}
}
}()
// Do stuff
// Quit goroutine
quit <- true
关闭退出通道而不是发送值。循环将退出,因为在关闭的通道 returns 上接收到零值。
此外,将通道声明为 chan struct{}
以指示通道值对程序不重要:
quit := make(chan struct{})
go func() {
for {
select {
case <- quit:
return
default:
// Do other stuff and return if complete.
}
}
}()
// Do stuff
// Quit goroutine
close(quit)
如果您需要突破 "other stuff",请将退出通道传递给 "other stuff" 并时不时检查一下:
select {
case <- quit:
return
default:
}
... keep going
如果您所做的不仅仅是此答案中的第一个片段,那么您应该考虑使用标准 context 包来取消信号。