私は再帰関数を持っています。関数は、取得するデータに応じてさまざまな値で自分自身を呼び出すため、再帰のアリティと深さは不明です。各呼び出しは、自分自身を 0 回以上呼び出す可能性があります。この関数は、任意の数の値を返すことができます。
ゴルーチンとチャネルを関与させて並列化したいと考えています。の各再帰はinner
独自のゴルーチンで実行され、チャネルで値を返します。外側の関数は、これらの値を処理します。
func outer(response []int) {
results := make([]int)
resultsChannel := make(chan int)
inner := func(...) {
resultsChannel <- «some result»;
// Recurse in a new goroutine.
for _, recursionArgument in «some calculated data» {
go inner(recursionArgument)
}
}
go inner(«initial values»);
for {
result := <- resultsChannel
results = append(results, result)
// HELP! How do I decide when to break?
}
return results
}
この問題は、結果チャネル ループをエスケープするときに発生します。再帰の「形」(不明なアリティと深さ) のため、「n 個のイベント後に終了する」とは言えず、センチネル値を送信することもできません。
すべての再帰が発生して から戻るタイミングを検出するにはどうすればよいouter
ですか? これにアプローチするより良い方法はありますか?