golang 并发设计模式(一)--资源生成器模式
发布时间:2020-12-16 18:29:51 所属栏目:大数据 来源:网络整理
导读:在应用系统中,常见的的应用场景就是调用一个生成器:生成订单号,序列号,随机数等。 golang goroutine为这种需求提供了强大的武器。 1.简单的生成器 package mainimport ("fmt""math/rand")func GenerateIntA()chan int {ch := make(chan int,10)go func()
在应用系统中,常见的的应用场景就是调用一个生成器:生成订单号,序列号,随机数等。 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) }
可以使用多路复用技术进行堆积叠加,增加服务能力 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) } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |