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

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

Mary-Kate Olsen
リリース: 2024-12-11 21:30:12
オリジナル
1090 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート