ホームページ >バックエンド開発 >Golang >すべてのゴルーチンが終了した後に Go チャネルを確実に閉じるにはどうすればよいですか?

すべてのゴルーチンが終了した後に Go チャネルを確実に閉じるにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-15 01:16:13362ブラウズ

How to Reliably Close a Go Channel After All Goroutines Finish?

ゴルーチンの完了後にチャネルを閉じる

Go でゴルーチンとチャネルを操作する場合、多くの場合、すべてのゴルーチンがいつ完了したかを判断する必要があります。を実行し、それに応じてチャネルを閉じます。質問では、ゴルーチンの生成後にチャネルを明示的に閉じる方法と、スレッドカウントを使用する方法の 2 つの一般的なアプローチが示されています。

明示的なチャネルの閉鎖

最初のアプローチには、ゴルーチンの生成後にチャネルを閉じることが含まれます。すべてのゴルーチンが作成されます。ただし、チャネルが途中で閉じられ、ゴルーチンが結果を送信できなくなる可能性があります。

スレッド数

2 番目のアプローチでは、スレッド数が維持されます。カウントがゼロに達するとチャネルが閉じられます。機能している一方で、スリープ コールまたはビジー待機に依存しているため、非効率的になる可能性があります。

Sync.WaitGroup ソリューション

このタスクを達成するためのより効率的で信頼性の高い方法は、次のとおりです。 sync.WaitGroup タイプを使用します。 WaitGroup を使用すると、タスクの完了順序に関係なく、特定の数のタスクを待機できます。 WaitGroup を使用するように元の例を変更すると、次のようになります。

import (
    "sync"
)

func main() {
    var wg sync.WaitGroup
    for i := 0; i <= 10; i++ {
        wg.Add(1)
        go func() {
            result := calculate()
            c <- result
            wg.Done()
        }()
    }

    // Close the channel when all goroutines are finished
    go func() {
        wg.Wait()
        close(c)
    }()

    for result := range c {
        all_result = append(all_result, result...)
    }
}

このアプローチにより、ゴルーチンはチャネルを閉じる前にタスクを完了でき、予期されるすべてのメッセージが確実に受信されるようになります。

以上がすべてのゴルーチンが終了した後に Go チャネルを確実に閉じるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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