golang 并发设计模式(一)--资源生成器模式

在应用系统中,常见的的应用场景就是调用一个生成器:生成订单号,序列号,随机数等。

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)
}


2.叠加增强型资源生成器

可以使用多路复用技术进行堆积叠加,增加服务能力
可以使用缓冲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)
	}
}


3.有时我们希望生成器能够自动的退出,这时可以使用golang channel的

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)
}

相关文章

Golang的文档和社区资源:为什么它可以帮助开发人员快速上手...
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有...