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

前端之家收集整理的这篇文章主要介绍了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)
}
原文链接:https://www.f2er.com/go/189592.html

猜你在找的Go相关文章