Iris Framework を使用したタイムアウト時のゴルーチンの実行の停止
ゴルーチンを使用する場合、一定の時間を超えた場合に実行を停止する必要があることがよくあります。期限。ただし、よく発生する問題は、タイムアウトが発生した後でもゴルーチンが実行され続けることです。
この問題に対処するために、次のコード スニペットが使用されます。
import ( "fmt" "time" "github.com/kataras/iris/v12" ) type Response struct { data interface{} status bool } func (s *CicService) 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 } }
Thisこのコードは、バッファリングされたチャネルと select ステートメントを利用して、50 ミリ秒のタイムアウトが経過した場合に goroutine を終了しようとします。ただし、期待される「タイムアウト」の出力は得られません。代わりに、出力にはタイムアウト メッセージとその後の "test" および "test1" の出力の両方が含まれます。
これが発生する理由を理解するには、Go のゴルーチンの動作を考慮することが重要です。 Go には、実行中の goroutine を強制的に停止する効率的な方法はありません。代わりに、チャネルやミューテックスなどの同期メカニズムを使用する必要があります。
コードで使用されているタイムアウトは、ゴルーチン自体ではなく、チャネルの受信操作でのタイムアウトです。したがって、受信操作がタイムアウトした場合でも、チャネルに送信していたゴルーチンは実行を継続し、後続の出力が行われます。
この状況では、ゴルーチン間に何らかの形式の同期性を実装する必要があります。 。これには、シグナル チャネルまたはコンテキストを使用して、長時間実行タスクを実行している goroutine にタイムアウトを伝え、キャンセルを適切に処理できるようにする必要があります。
Go および Go での goroutine 実行の制限を理解することで、適切な同期手法を採用すると、タイムアウト時にゴルーチンを効果的に停止できます。
以上がIris フレームワークでタイムアウト時に Goroutine の実行を正常に停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。