タイムアウトでゴルーチンの実行を停止する
Go では、ゴルーチンはコードを同時に実行するための軽量な方法を提供します。ただし、特定の時間が経過した後に goroutine を停止する必要がある場合があります。
問題:
タイムアウト後も goroutine が実行を続けるという問題が発生しました。設定されました。彼らは、ゴルーチンがタイムアウトに達するとすぐに停止することを期待していましたが、代わりに追加のメッセージが出力されました。コードの例を次に示します。
type Response struct { data interface{} status bool } func Find() (interface{}, bool) { ch := make(chan Response, 1) go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }() select { case <-ch: fmt.Println("Read from ch") res := <-ch return res.data, res.status case <-time.After(50 * time.Millisecond): return "Timed out", false } }
期待される出力:
実際の出力:
分析:
受信側でタイムアウトが設定されているために問題が発生します送信側ではなく、チャネル ch の。タイムアウトは 50 ミリ秒以内にデータが受信されなかったことを正しく識別しますが、ゴルーチンがさらに実行され、その後チャネル上でデータが送信されることを妨げません。
解決策:
Go では goroutine の実行を直接中断することはできないため、代替アプローチは次のとおりです。必要:
以上がタイムアウト後に Go Goroutine の実行を停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。