Go言語の並行処理(orチャネル)について
はじめに
最近、オライリーから出ているGo言語による並行処理の本を読んでます。
Go言語の並行処理について様々なことが書かれているので、並行処理について詳しく知りたい方にはおすすめです。
その中で、個人的に知らなかったことをpostします。
orチャネルパターン
複数のチャネルを合成し、どれか1つのチャネルがcloseされたら、他全てのチャネルもcloseする、といったことができます。
var or func(channels ... <-chan interface{}) <-chan interface{} or = func(channels ...<-chan interface{}) <- chan interface{} { switch len(channels){ case 0: return nil case 1: return channels[0] } orDone := make(chan interface{}) go func(){ defer close(orDone) switch len(channels){ case 2: select { case <-channels[0]: case <-channels[1]: } default: select { case <-channels[0]: case <-channels[1]: case <-channels[2]: case <- or(append(channels[3:], orDone)...): } } }() return orDone }
例えば、ダウンロード処理などで複数のdoneチャネルをまとめて終了させる場合に有効です?
利用シーンが思いついたら追記します。
また、この他にも本を読み進めて知らないことがあればpostしていきたいと思ってます。