ホームページ >バックエンド開発 >Golang >Go でタイムアウト後に Goroutine の実行を適切に停止するにはどうすればよいですか?

Go でタイムアウト後に Goroutine の実行を適切に停止するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-12-11 21:30:12974ブラウズ

How Can I Properly Stop a Goroutine's Execution After a Timeout in Go?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。