Go でのタイムアウトによる goroutine の実行の停止
タイムアウト時に goroutine の実行を終了しようとすると、効果がないように見える場合があります。これは、Go の同時実行モデルがフォークジョインの原則に基づいて動作し、ゴルーチン (フォーク) を開始してもその実行を即座に制御できないためです。制御は、チャネル通信などの同期ポイントでのみ回復されます。
指定された例では:
go func() { time.Sleep(10 * time.Second) fmt.Println("test") fmt.Println("test1") ch <- Response{data: "data", status: true} }()
タイムアウトが設定されているにもかかわらず、ゴルーチンは実行を継続します:
case <-time.After(50 * time.Millisecond): return "Timed out", false
これは、タイムアウトが送信者ではなく、チャネルの受信者 (リーダー) に関係するためです。チャネルがバッファリングされるため、送信側は中断することなく実行を続けることができます。
望ましい動作を実現するには、同期技術を使用する必要があります。たとえば、それ以上の通信を防ぐために、タイムアウト時にチャネルを閉じることができます:
select { case <-ch: fmt.Println("Read from ch") res := <-ch return res.data, res.status case <-time.After(50 * time.Millisecond): close(ch) return "Timed out", false }
以上がGo でタイムアウト後に Goroutine の実行を適切に停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。