再帰関数を実行する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
は機能せず、たぶん再帰のインスタンスが1つだけ終了します。
終了信号を送信して再帰関数のすべてのインスタンスを停止するにはどうすればよいですか?
ゴーでは、我々はcontext.Contextを持っています依存するゴルーチンの階層を作成する。 http://stackoverflow.com/questions/42516717/how-to-stop-goroutine/42518866#42518866 –
なぜチャンネルを閉じたくないのですか?それはあなたが何を記述するのが最も簡単な方法なので、他にどのような制限があるか知ることは良いことです。 – djd
1つのチャンネルを使用している場合は、アプリ内のすべてのゴルーチンを停止しています。または、この特定の目的にチャネルを使用する場合は、それらをすべて手動で管理する必要があります。また、あなたのアプリでアクティブなgorutinesの一部を停止する必要がある場合は、どうすればよいでしょうか?さらに、 'context.Context'を使うことは、Goのゴルーチンを管理するための慣習的なパターンです。 –