長さが不明なチャネルを閉じる
提供されたコードでは、複数のゴルーチンが送信を試みるため、「閉じたチャネルで送信」というエラーが発生します。すでに閉じられているチャネルの値。この問題は、他のゴルーチンがまだデータを送信している間に 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 サイトの他の関連記事を参照してください。