在应用系统中,常见的的应用场景就是调用一个生成器:生成订单号,序列号,随机数等。
golang goroutine为这种需求提供了强大的武器。
1.简单的生成器
package main import ( "fmt" "math/rand" ) func GenerateIntA()chan int { ch := make(chan int ,10) go func(){ for { ch<-rand.Int() } }() return ch } func main(){ ch := GenerateIntA() fmt.Println(<-ch) fmt.Println(<-ch) }
可以使用多路复用技术进行堆积叠加,增加服务能力
可以使用缓冲chan增加服务能力
package main import ( "fmt" "math/rand" ) 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 { case ch <- <-GenerateIntA(): case ch <- <-GenerateIntB(): } } }() return ch } func main() { ch := GenerateInt() for i := 0; i < 100; i++ { fmt.Println(<-ch) } }
Close channel to broadcast 机制实现:
package main import ( "fmt" "math/rand" ) func GenerateIntA(done chan struct{})chan int { ch := make(chan int ) go func(){ Lable: for { select { case ch<-rand.Int(): case <-done: break Lable } } close(ch) }() return ch } func main(){ done :=make(chan struct{}) ch := GenerateIntA(done) fmt.Println(<-ch) fmt.Println(<-ch) close(done) fmt.Println(<-ch) fmt.Println(<-ch) fmt.Println(<-ch) fmt.Println(<-ch) }
有疑问加站长微信联系(非本文作者)