channel关闭---一写多读

2018-12-19  本文已影响0人  bocsoft

这种场景下这个唯一的写入端可以关闭 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

*/




上一篇下一篇

猜你喜欢

热点阅读