ホームページ > バックエンド開発 > Golang > Go で長さが不明なチャネルを安全に閉じるにはどうすればよいですか?

Go で長さが不明なチャネルを安全に閉じるにはどうすればよいですか?

Patricia Arquette
リリース: 2024-12-23 17:44:14
オリジナル
498 人が閲覧しました

How to Safely Close a Channel of Unknown Length in Go?

長さが不明なチャネルを閉じる

提供されたコードでは、複数のゴルーチンが送信を試みるため、「閉じたチャネルで送信」というエラーが発生します。すでに閉じられているチャネルの値。この問題は、他のゴルーチンがまだデータを送信している間に 1 つのゴルーチンがチャネルを閉じるため、ゴルーチン間の同期が欠如していることが原因で発生します。

この状況でチャネルを効果的に閉じるには、すべての送信側ゴルーチンがいつ完了したかを判断することが重要です。任務を完了しました。これは、sync.WaitGroup を使用して、すべての送信者のゴルーチンが値の送信を完了したことを検出することで実現できます。

sync.WaitGroup を使用する変更されたコードは次のとおりです。

func gen(ch chan int, wg *sync.WaitGroup) {
    defer wg.Done()
    var i int
    for {
        time.Sleep(time.Millisecond * 10)
        ch <- i
        i++
        // when no more data (e.g. from db, or event stream)
        if i > 100 {
            break
        }
    }
}

func receiver(ch chan int) {
    for i := range ch {
        fmt.Println("received:", i)
    }
}

func main() {
    ch := make(chan int)
    wg := &sync.WaitGroup{}

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go gen(ch, wg)
    }

    go func() {
        wg.Wait()
        close(ch)
    }()

    receiver(ch)
}
ログイン後にコピー

このソリューションでは、各送信者のゴルーチンは sync.WaitGroup に 1 つを追加して、チャネル上で値を送信することを示します。 close() ゴルーチンの wg.Wait() は、すべての送信側ゴルーチンがタスクを完了した後にのみチャネルが閉じられるようにし、「閉じられたチャネルで送信」エラーを防ぎます。

以上がGo で長さが不明なチャネルを安全に閉じるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート