43 lines
657 B
Go
43 lines
657 B
Go
package main
|
|
|
|
import "sync"
|
|
|
|
//某些操作只需要在高并发场景中做一次,例如加载配置文件
|
|
//这种场景下用到sync.once
|
|
|
|
var waitGroup sync.WaitGroup
|
|
var once sync.Once
|
|
|
|
func send(ch1 chan<- int) {
|
|
defer waitGroup.Done()
|
|
for i := 0; i < 100; i++ {
|
|
ch1 <- i
|
|
}
|
|
close(ch1)
|
|
}
|
|
func getV(ch1 <-chan int, ch2 chan<- int) {
|
|
defer waitGroup.Done()
|
|
for {
|
|
x, ok := <-ch1
|
|
if !ok {
|
|
break
|
|
}
|
|
ch2 <- x * x
|
|
}
|
|
once.Do(func() { close(ch2) })
|
|
}
|
|
|
|
func main() {
|
|
a := make(chan int, 100)
|
|
b := make(chan int, 100)
|
|
waitGroup.Add(3)
|
|
go send(a)
|
|
go getV(a, b)
|
|
go getV(a, b)
|
|
waitGroup.Wait()
|
|
for ret := range b {
|
|
println(ret)
|
|
}
|
|
|
|
}
|