美文网首页
channel关闭---一写多读

channel关闭---一写多读

作者: bocsoft | 来源:发表于2018-12-19 14:11 被阅读0次

    这种场景下这个唯一的写入端可以关闭 channel 用来通知读取端所有数据都已经写入完成了。读取端只需要用 for range 把 channel 中数据遍历完就可以了,当channel 关闭时,for range 仍然会将 channel 缓冲中的数据全部遍历完然后再退出循环:

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    /*
    一写多读
    这种场景下这个唯一的写入端可以关闭 channel 用来通知读取端所有数据都已经写入完成了。
    读取端只需要用 for range 把 channel 中数据遍历完就可以了,当� channel 关闭时,
    for range 仍然会将 channel 缓冲中的数据全部遍历完然后再退出循环:
    */
    func main() {
        wg := &sync.WaitGroup{}
        ch := make(chan int, 100)
    
        send := func() {
            for i := 0; i < 100; i++ {
                ch <- i
            }
            //signal sending finish
            close(ch)
        }
    
        recv := func(id int) {
            defer wg.Done()
            for i := range ch {
                fmt.Printf("receiver #%d get %d\n", id, i)
            }
            fmt.Printf("receiver #%d exit\n", id)
        }
    
        wg.Add(3)
    
        //多读
        go recv(0)
        go recv(1)
        go recv(2)
    
        //一写
        send()
    
        wg.Wait()
    
    }
    
    /* 输出结果:
    receiver #2 get 0
    receiver #2 get 1
    receiver #2 get 2
    receiver #2 get 3
    receiver #2 get 4
    receiver #2 get 5
    receiver #2 get 6
    receiver #2 get 7
    receiver #2 get 8
    receiver #2 get 9
    receiver #2 get 10
    receiver #2 get 11
    receiver #2 get 12
    receiver #2 get 13
    receiver #2 get 14
    receiver #2 get 15
    receiver #2 get 16
    receiver #2 get 17
    receiver #2 get 18
    receiver #2 get 19
    receiver #2 get 20
    receiver #2 get 21
    receiver #2 get 22
    receiver #2 get 23
    receiver #2 get 24
    receiver #2 get 25
    receiver #2 get 26
    receiver #2 get 27
    receiver #2 get 28
    receiver #2 get 29
    receiver #2 get 30
    receiver #2 get 31
    receiver #2 get 32
    receiver #2 get 33
    receiver #2 get 34
    receiver #2 get 35
    receiver #2 get 36
    receiver #2 get 37
    receiver #2 get 38
    receiver #2 get 39
    receiver #2 get 40
    receiver #2 get 41
    receiver #2 get 42
    receiver #2 get 43
    receiver #2 get 44
    receiver #2 get 45
    receiver #2 get 46
    receiver #2 get 47
    receiver #2 get 48
    receiver #2 get 49
    receiver #2 get 50
    receiver #2 get 51
    receiver #2 get 52
    receiver #2 get 53
    receiver #2 get 54
    receiver #2 get 55
    receiver #2 get 56
    receiver #2 get 57
    receiver #2 get 58
    receiver #2 get 59
    receiver #2 get 60
    receiver #2 get 61
    receiver #2 get 62
    receiver #2 get 63
    receiver #2 get 64
    receiver #2 get 65
    receiver #2 get 66
    receiver #2 get 67
    receiver #2 get 68
    receiver #2 get 69
    receiver #2 get 70
    receiver #2 get 71
    receiver #2 get 72
    receiver #2 get 73
    receiver #2 get 74
    receiver #2 get 75
    receiver #2 get 76
    receiver #2 get 77
    receiver #2 get 78
    receiver #2 get 79
    receiver #2 get 80
    receiver #2 get 81
    receiver #2 get 82
    receiver #2 get 83
    receiver #2 get 84
    receiver #2 get 85
    receiver #2 get 86
    receiver #2 get 87
    receiver #2 get 88
    receiver #2 get 89
    receiver #2 get 90
    receiver #2 get 91
    receiver #2 get 92
    receiver #2 get 93
    receiver #2 get 94
    receiver #2 get 95
    receiver #2 get 96
    receiver #2 get 97
    receiver #2 get 98
    receiver #2 get 99
    receiver #2 exit
    receiver #0 exit
    receiver #1 exit
    
    */
    
    
    
    
    

    相关文章

      网友评论

          本文标题:channel关闭---一写多读

          本文链接:https://www.haomeiwen.com/subject/xjkjkqtx.html