go并发设计模式 --资源生成器模式
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)
- }
4.可以更牛逼点,既要并发、缓冲,又有通知的生成器:
- package main
- import (
- "fmt"
- "math/rand"
- )
- func GenerateIntA(done chan struct{}) chan int {
- ch := make(chan int, 5)
- go func() {
- Lable:
- for {
- select {
- case ch <- rand.Int():
- case <-done:
- break Lable
- }
- }
- close(ch)
- }()
- return ch
- }
- func GenerateIntB(done chan struct{}) chan int {
- ch := make(chan int, 10)
- go func() {
- Lable:
- for {
- select {
- case ch <- rand.Int():
- case <-done:
- break Lable
- }
- }
- close(ch)
- }()
- return ch
- }
- func GenerateInt(done chan struct{}) chan int {
- ch := make(chan int)
- send := make(chan struct{})
- go func() {
- Lable:
- for {
- select {
- case ch <- <-GenerateIntA(send):
- case ch <- <-GenerateIntB(send):
- case <-done:
- send <- struct{}{}
- send <- struct{}{}
- break Lable
- }
- }
- close(ch)
- }()
- return ch
- }
- func main() {
- done := make(chan struct{})
- ch := GenerateInt(done)
- for i := 0; i < 10; i++ {
- fmt.Println(<-ch)
- }
- done <- struct{}{}
- for i := 0; i < 10; i++ {
- v := <-ch
- if v == 0 {
- return
- }
- fmt.Println(<-ch)
- }
- }
go并发设计模式 --资源生成器模式的更多相关文章
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- Java设计模式:生成器模式
问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...
- 【设计模式】- 生成器模式(Builder)
生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...
- Java设计模式-Builder生成器模式
概念: 生成器模式也称之为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,构建与产品分离. UML: Ibuild接口清晰地反映了创建产品Product的流程. 生成器模式涉及4个关键 ...
- 面向对象设计模式_生成器模式详解(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- 设计模式十: 生成器模式(Builder Pattern)
简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...
- 面向对象设计模式_生成器模式解读(Builder Pattern)
首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...
- 设计模式--Builder生成器模式
如果文章中哪里有问题,希望各位大哥大姐指出,小弟十分感激. 正文 什么是生成器模式? 生成器模式就是把生产对象的过程进一步抽取.细化.独立.以往我们生产对象,可能就是在一个小作坊里面从头做到尾.现在用 ...
- Head First设计模式之生成器模式
一.定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.建造者模式是一种对象创建型模式. 二.结构 角色 Builder(抽象建造者):它为创建一个产品Product对象的 ...
随机推荐
- 转/ C# 托管资源和非托管资源
原文 对于这两个一直就是模模糊糊的,半知零解 托管资源指的是.NET可以自动进行回收的资源,主要是指托管堆上分配的内存资源.托管资源的回收工作是不需要人工干预的,由.NET运行库在合适时调用垃圾回收器 ...
- 开源作品-PHP写的JS和CSS文件压缩利器(单文件绿色版)-SuMinify_PHP_1_5
前言: 网站项目需要引用外部文件以减小加载流量,而且第一次加载外部资源文件后,其他同域名的页面如果引用相同的地址,可以利用浏览器缓存直接读取本地缓存资源文件,而不需要每个页面都下载相同的外部资源文件. ...
- ANN:DNN结构演进History—LSTM_NN
前言 语音识别和动作识别(Action.Activities) 等一些时序问题,通过微分方式可以视为模式识别方法中的变长模式识别问题.语音识别的基元为音素.音节,字母和句子模式是在时间轴上的变长序列 ...
- 基于物品的协同过滤ItemCF的mapreduce实现
文章的UML图比较好看..... 原文链接:www.cnblogs.com/anny-1980/articles/3519555.html 基于物品的协同过滤ItemCF 数据集字段: 1. Use ...
- CorelDRAW X7软件中如何将图片剪贴到文字中
将 图片剪贴到文字中是平面设计常用的一种处理方法之一,将图片剪贴到文字中是指将图片置入到该文字,且图片的外轮廓是沿着文字的形状剪贴的,这种处理手法被广泛应用于排版设计中.本教程将带大家了解如何用Cor ...
- Selenium3+python自动化008-常用操作
一.元素常用操作 1. clear() 清除文本 2. send_keys() 模拟输入 3. click() 单击元素 4.get_attr ...
- 如何在vue里面正确的引用 jquery 和 第三方插件
vue-cli webpack全局引入jquery(jq通过npm安装的并非本地文件) 1.首先在package.json里加入, dependencies:{ "jquery" ...
- Java中数组的概念与特点
数组概念: 数组其实也是一个容器,可以用来存储固定个数相同类型的数据数组的定义 数组中存储的数据叫做元素 特点: 1.数组是引用数据类型 2.数组的长度是固定的,也就是说可以存储固定个数的数据 3.数 ...
- centos7 redmine安装过程(转载)
redmine 部署过程 redmin官方文档写的太烂加上不熟悉ruby搞了半天,回到家后觉得还是记录下好,希望可以帮助有需要的人,少走弯路. 版本说明 下面的版本很重要redmine 版本 3.3 ...
- JS 100节楼梯,0-49节 分数等于节数 50以后(包括50)每节10分输入节数 得出分数
var n = parseInt(prompt("请输入数值")); ; ; ){ ; i<n; i++) { sum = sum + i; } alert(sum); } ...