私は、無限の数の値を生成できるゴルーチンを持っていますが、それぞれの値を見つけるまでに時間がかかります。私は時間制限を追加する方法、例えば10秒後に、私の関数が今までに受け取った最良の値で何かをする方法を見つけようとしています。特定の時間量のゴルーチンからの値の受け取り
これは、チャネル、タイマーを使用して、私の現在の「解決策」である:
// the goroutine which runs infinitely
// (or at least a very long time for high values of depth)
func runSearch(depth int, ch chan int) {
for i := 1; i <= depth; i++ {
fmt.Printf("Searching to depth %v\n", i)
ch <- search(i)
}
}
// consumes progressively better values until the channel is closed
func awaitBestResult(ch chan int) {
var result int
for result := range ch {
best = result
}
// do something with best result here
}
// run both consumer and producer
func main() {
timer := time.NewTimer(time.Millisecond * 2000)
ch := make(chan int)
go runSearch(1000, ch)
go awaitBestResult(ch)
<-timer.C
close(ch)
}
は、これは主に動作します - タイマー終了後に最良の結果が処理され、チャネルが閉じられています。しかし、チャンネルがメイン関数によって閉じられているので、私はrunSearch
ゴルーチンからパニック(panic: send on closed channel
)を取得します。
タイマー完了後、最初のゴルーチンの実行を停止するにはどうすればよいですか?どんな助けもありがとうございます。
:
main()
で次に'メイン'。 goroutineの外側でそれを行う必要がある場合は、goroutineがチェックする別のチャネルを作成して、それを閉じて 'main'でgoroutineに停止するように指示することができます。 –