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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-12-24 11:21:15182ブラウズ

How to Stop a Go Goroutine Execution After a Timeout?

タイムアウトでゴルーチンの実行を停止する

Go では、ゴルーチンはコードを同時に実行するための軽量な方法を提供します。ただし、特定の時間が経過した後に goroutine を停止する必要がある場合があります。

問題:

タイムアウト後も goroutine が実行を続けるという問題が発生しました。設定されました。彼らは、ゴルーチンがタイムアウトに達するとすぐに停止することを期待していましたが、代わりに追加のメッセージが出力されました。コードの例を次に示します。

type Response struct {
    data   interface{}
    status bool
}

func Find() (interface{}, bool) {
    ch := make(chan Response, 1)

    go func() {
        time.Sleep(10 * time.Second)
        fmt.Println("test")
        fmt.Println("test1")
        ch <- Response{data: "data", status: true}
    }()

    select {
    case <-ch:
        fmt.Println("Read from ch")
        res := <-ch
        return res.data, res.status
    case <-time.After(50 * time.Millisecond):
        return "Timed out", false
    }
}

期待される出力:

  • タイムアウト

実際の出力:

  • 時間指定out
  • test
  • test1

分析:

受信側でタイムアウトが設定されているために問題が発生します送信側ではなく、チャネル ch の。タイムアウトは 50 ミリ秒以内にデータが受信されなかったことを正しく識別しますが、ゴルーチンがさらに実行され、その後チャネル上でデータが送信されることを妨げません。

解決策:

Go では goroutine の実行を直接中断することはできないため、代替アプローチは次のとおりです。必要:

  • バッファリングされていないチャネルを使用します。これにより、送信がブロックされ、ゴルーチンが受信の準備ができるまで強制的に待機します。
  • キャンセル付きのコンテキストを使用し、それをゴルーチンに渡します。タイムアウトが発生した場合、コンテキストをキャンセルすると、ゴルーチンはコンテキストをチェックして早期に戻る必要があります。
  • ミューテックスや待機グループなどのカスタム同期手法を使用して、ゴルーチンの実行を制御し、適切なタイミングで終了するようにします。

以上がタイムアウト後に Go Goroutine の実行を停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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