ホームページ >バックエンド開発 >Golang >Golang コルーチンが終了する

Golang コルーチンが終了する

王林
王林オリジナル
2023-05-13 10:16:371072ブラウズ

Go 言語では、コルーチンは重要な同時プログラミング メカニズムです。複数のタスクを並行して実行できるため、プログラムの効率が向上します。 Go 言語のコルーチン実装は軽量スレッド (またはユーザーレベルのスレッド) に基づいているため、コルーチンの作成と破棄のコストは非常に小さくなります。ただし、実際の開発では、実行中のコルーチンを閉じる必要がある場合があり、この場合、これを実現するために何らかの特別な手段を使用する必要があります。この記事では、golang コルーチンのシャットダウンに関するいくつかの方法とテクニックを紹介します。

1. コルーチンの本質

コルーチンを閉じる方法を理解する前に、まずコルーチンの性質を理解する必要があります。コルーチンは本質的に、メインスレッドと並行して実行される独立した実行スレッドです。各コルーチンには独自のスタック変数とローカル変数がありますが、同じプロセス変数とグローバル変数を共有します。コルーチンの作成と破棄にはいくつかの命令だけが必要なので、非常に効率的です。

2. コルーチンを閉じる方法

  1. context.Context を通じてコルーチンを閉じる

Go 言語では、context.Context を使用してコントロールを実行できます。コルーチンの実行。キャンセル関数付きのコンテキストは context.WithCancel 関数によって作成できます。コンテキストの Cancel 関数が呼び出されると、コンテキストに依存するすべてのコルーチンが閉じられます。以下は簡単なサンプル コードです。

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    go func() {
        for {
            select {
            case <-ctx.Done():
                log.Println("The goroutine is stopped.")
                return
            default:
                // do something
            }
        }
    }()
    time.Sleep(time.Second)
    cancel()
    time.Sleep(time.Second)
}

この例では、キャンセル関数を備えた Context を作成し、Context がキャンセルされるまで特定の操作が継続的に実行されるコルーチンを作成します。メインスレッドで 1 秒待ってから、Context の Cancel 関数を呼び出してコルーチンを閉じます。

  1. チャネルを通じてコルーチンを閉じる

context.Context を使用してコルーチンの実行を制御するだけでなく、チャネルを使用してコルーチンを実装することもできます。通常、コルーチンを閉じるかどうかの信号を渡す bool 型チャネルを作成できます。メインスレッドがチャネルの close 関数を呼び出すと、チャネルを読み取っているすべてのコルーチンはゼロ値シグナルを受信して​​終了します。以下はサンプル コードです。

func main() {
    stopCh := make(chan bool)
    go func() {
        for {
            select {
            case <-stopCh:
                log.Println("The goroutine is stopped.")
                return
            default:
                // do something
            }
        }
    }()
    time.Sleep(time.Second)
    close(stopCh)
    time.Sleep(time.Second)
}

この例では、コルーチンを閉じるかどうかの信号を渡す bool 型チャネルを作成します。コルーチンでは、select ステートメントを使用してチャネルが閉じているかどうかを継続的に確認し、チャネルが閉じている場合は終了します。メインスレッドで 1 秒待ってから、チャネルの close 関数を呼び出してコルーチンを閉じます。

  1. sync.WaitGroup を通じてコルーチンを閉じる

context.Context とチャネルを使用してコルーチンの実行を制御することに加えて、sync.WaitGroup を使用して次のこともできます。それを実装します。 WaitGroup は、コルーチンのグループの終了を待つために使用できるカウンターです。具体的には、コルーチンの作成時に WaitGroup のカウンタが 1 つインクリメントされ、コルーチンの実行後にカウンタが 1 つデクリメントされます。メイン スレッドで、WaitGroup の Wait 関数を呼び出して、すべてのコルーチンの実行が完了するのを待ってからプログラムを閉じます。サンプル コードは次のとおりです。

func main() {
    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        for {
            // do something
        }
    }()
    time.Sleep(time.Second)
    wg.Done()
    wg.Wait()
}

この例では、WaitGroup を作成し、カウンターを 1 つインクリメントします。コルーチンで特定の操作を実行し、コルーチンの終了を待ち、WaitGroup の Done 関数を呼び出してカウンターを 1 つデクリメントします。 WaitGroup の Done 関数を呼び出す前にメイン スレッドで 1 秒待ってから、Wait 関数を呼び出してすべてのコルーチンの実行が完了するのを待ってからプログラムを閉じます。

3. 概要

Go 言語のコルーチンは非常に強力な同時プログラミング メカニズムであり、開発で広く使用されています。ただし、実際の開発では、実行中のコルーチンを閉じる必要がある場合があり、この場合、これを達成するために何らかの特別な手段を使用する必要があります。この記事では、golang コルーチンを閉じるための方法とテクニックをいくつか紹介します。

以上がGolang コルーチンが終了するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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