并发模式,并不是设计模式,而是编写多go程和使用chan的通用套路:
生成器
生成器不停的产生服务/任务,返回一个服务句柄,用于跟服务交互
//不停的产生任务/服务,返回一个任务/服务句柄,用于跟服务交互
func msgGenerator() chan string {
c := make(chan string)
go func() {
i := 0
for {
time.Sleep(time.Duration(rand.Intn(1500)) * time.Microsecond)
c <- fmt.Sprintf("message %d",i)
i++
}
}()
return c
}
func main() {
m1 := msgGenerator()
m2 := msgGenerator()
for {
fmt.Println(<-m1)
fmt.Println(<-m2)
}
}
想要同时处理多个服务,可以将连个chan的服务同时发给第三个chan,同时等待多个服务
- 有确定的服务个数:
func fanIn2(c1, c2 chan string) chan string {
c3 := make(chan string)
go func() {
for {
select {
case data := <-c1:
c3 <- data
case data := <-c2:
c3 <- data
}
}
}()
return c3
}
func main() {
c1 := msgGenerator("1")
c2 := msgGenerator("2")
m := fanIn2(c1, c2)
for {
fmt.Println(<-m)
}
}
2.在没有确定任务chan个数的情况下,只能采取多go程的方法
func fanIn(chs ...chan string) chan string {
c := make(chan string)
for _,ch := range chs {
go func(in chan string) {
for {
c <- <-ch
}
}(ch)
}
return c
}