タイムアウト時のゴルーチン実行のキャンセル
Go ルーチンでは、特定の時間しきい値を超えて操作を終了する必要がある場合があります。 Go は通常、ゴルーチンの実行を直接制御せずに非同期でゴルーチンを実行するため、これには課題が生じる可能性があります。 iris フレームワークを使用する場合、タイムアウトが発生した後でもゴルーチンが実行を継続する状況に遭遇する可能性がある、一般的なシナリオの 1 つが発生します。
次のコード スニペットを考えてみましょう。
package main import ( "fmt" "time" ) func main() { Res := make(chan Response, 1) go func() { time.Sleep(10 * time.Second) fmt.Println("test") Res <- Response{data: "data", status: true} }() select { case <-Res: fmt.Println("Read from ch") res := <-Res fmt.Println(res.data, res.status) case <-time.After(50 * time.Millisecond): fmt.Println("Timed out") } } type Response struct { data interface{} status bool }
図のようにこの例では、10 秒の遅延後にゴルーチンが起動され、テストが印刷されます。チャネル (Res) は、ゴルーチンとメインのゴルーチン間の通信を容易にするために使用されます。 select ステートメントは、ゴルーチンからの応答または 50 ミリ秒のタイムアウトを待機するために使用されます。
ただし、予期される動作は、タイムアウトが発生するとすぐにゴルーチンを終了する必要があることです。代わりに、タイムアウトが経過してもテストがまだ出力されていることが出力に表示されます。
これは、Go には実行中のゴルーチンの実行を強制的に中断する簡単な方法がないために発生します。 Go はフォークジョイン同時実行モデルで動作し、新しい goroutine が別個の実行スレッドとして作成されます。ゴルーチンの作成後は、ゴルーチンのスケジューリングと処理が Go ランタイムの責任の一部になります。
この問題に対処するには、ゴルーチンの動作をより詳細に制御できる同期手法を採用することをお勧めします。
以上がタイムアウト後に Go Goroutine の実行をキャンセルするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。