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

hittata · · 2431 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

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的

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










有疑问加站长微信联系(非本文作者)

本文来自:CSDN博客

感谢作者:hittata

查看原文:golang 并发设计模式(一)--资源生成器模式

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2431 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传