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
*/