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

タイムアウト後に Go Goroutine の実行をキャンセルするにはどうすればよいですか?

Susan Sarandon
リリース: 2024-12-16 18:56:15
オリジナル
330 人が閲覧しました

How to Cancel a Go Goroutine's Execution After a Timeout?

タイムアウト時のゴルーチン実行のキャンセル

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

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