在应用系统中,常见的的应用场景就是调用一个生成器:生成订单号,序列号,随机数等。
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) } }
Closechanneltobroadcast 机制实现:
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) }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。