「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go で実行中のゴルーチンを正常に終了するにはどうすればよいですか?

Go で実行中のゴルーチンを正常に終了するにはどうすればよいですか?

2024 年 11 月 4 日に公開
ブラウズ:958

How to Gracefully Terminate a Running Goroutine in Go?

Goroutine に終了の通知

Go では、アプリケーションの正常なシャットダウンを確保したり、リソース割り当てを管理したりするときに、Goroutine の終了を処理することが重要になることがあります。この記事では、実行中のゴルーチンにその実行を停止するよう信号を送信する手法について説明します。

お問い合わせで提供されている例は、無限ループするゴルーチンを示し、連続処理をシミュレートしています。目標は、指定されたタイムアウトを超えた場合にこのゴルーチンを終了することです。

最初のアプローチでは、通信用とシグナリング終了用の 2 つのチャネルを使用します。ただし、シグナリング チャネルから読み取るとゴルーチンがブロックされ、本来の目的が果たせなくなります。

追加の停止チャネルの使用

効果的な解決策の 1 つは、追加の停止チャネルを導入することです。 、tooLate、タイプ chan struct{}。 goroutine 内では、select ステートメントを使用して通信チャネルと停止チャネルの両方を監視します。 tooLate チャネルが値を受け取ると、ゴルーチンは正常に戻り、その処理ループを終了します。

変更されたコード スニペットは次のとおりです。

func main() {
    // tooLate channel to signal goroutine to stop
    tooLate := make(chan struct{})
    proCh := make(chan string)

    go func() {
        for {
            fmt.Println("working")
            time.Sleep(1 * time.Second)

            select {
            case 

このソリューションでは、proCh チャネルが通信に引き続き使用され、tooLate チャネルが終了信号として機能します。 tooLate チャネルが閉じられると、ゴルーチンはこれを検出してループを終了します。

その他の考慮事項

追加のチャネルを使用する以外にも、ゴルーチンにシグナルを送信するための代替アプローチがあります。たとえば、組み込みの sync.Cond 型を使用して goroutine 同期をより詳細に制御します。どの手法を選択するかは、アプリケーションの特定の要件によって異なります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3