凝視運行遞歸函數的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的慣用模式。 –