凝视运行递归函数的goroutine,我想发送一个信号来停止这些递归函数。这是函数(功能并不重要):停止在goroutine中的所有递归函数
func RecursiveFunc(x int, depth int, quit chan bool) int {
if depth == 0 {
return 1
}
if quit != nil {
select {
case <-quit:
return 0
default:
}
}
total := 0
for i := 0; i < x; i++ {
y := RecursiveFunc(x, depth - 1, quit)
if y > 0 {
total += y
}
}
return total
}
该函数可以采用做很长一段时间,我想发送的退出信号,之后停止和使用的结果(不管它是什么)。要运行它:
import (
"fmt"
"time"
"sync"
)
func main() {
quit := make(chan bool)
wg := &sync.WaitGroup{}
result := -1
go func() {
defer wg.Done()
wg.Add(1)
result = RecursiveFunc(5, 20, quit)
}()
time.Sleep(10 * time.Millisecond)
close(quit) // Using `quit <- true` doesn't work
wg.Wait()
fmt.Println(result)
}
要停止够程,我使用的信道说quit
和关闭它后,程序效果很好,但我不希望真的关闭通道,我想只是发信号quit <- true
。但是,quit <- true
不起作用,我可能只退出递归的一个实例。
如何通过发送退出信号来停止递归函数的所有实例?
在转到我们context.Context创建依赖门廊的层次结构;请参阅http://stackoverflow.com/questions/42516717/how-to-stop-goroutine/42518866#42518866 –
为什么你不想关闭频道?这是你描述的最简单的方法,所以最好知道你有什么其他限制。 – djd
如果您使用单个通道,则会停止应用中的所有goroutines。或者,如果您希望将渠道用于此特定用途,则必须手动管理它们。如果您只需要在应用程序中停止一部分活动goroutines,那么您会怎么做?此外,使用'context.Context'是Go中管理goroutines的惯用模式。 –