yanom blog

様々な技術について書きます

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していきたいと思ってます。