1、扇入(Fan in)
指的是将多路通道聚合到一条通道中处理。在golang中最简单的扇入就是使用select聚合多条通道服务;
当生产者的速度很慢时,需要使用扇入技术聚合多个生产者满足消费者。
2、扇出(Fan out)
指的是将一条通道发散到多条通道中处理,在golang中的具体实现就是使用go关键字启动多个goroutine并发处理。
当消费者的速度很慢时,需要使用扇出技术来并发处理请求。
3、扇入(Fan in)示例
不知道有多少个chan的情况:
func fansIn(chs ... chan string) chan string{
c := make(chan string)
for _,ch := range chs {
go func(in chan string){
for {
c <- <-ch
}
}(ch) //利用传参,避免golang的循环变量中的坑。
}
return c
}
知道有多少个chan的情况:
func GenerateIntA() chan int {
ch := make(chan int,10)
go func(){
for{
ch <- rand.Int()
}
}()
return ch
}
func GenerateIntB() chan int {
ch := make(chan int,10)
go func(){
for{
ch <- rand.Int()
}
}()
return ch
}
func GenerateInt() chan int {
ch := make(chan int,20)
go func(){
for{
//使用select 的 扇入技术(Fan in)
select{
case ch <- <-GenerateIntA():
case ch <- <-GenerateIntB():
}
}
}()
return ch
}