1.简单的生成器

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. )
  6. func GenerateIntA()chan int {
  7. ch := make(chan int ,10)
  8. go func(){
  9. for {
  10. ch<-rand.Int()
  11. }
  12. }()
  13. return ch
  14. }
  15. func main(){
  16. ch := GenerateIntA()
  17. fmt.Println(<-ch)
  18. fmt.Println(<-ch)
  19. }

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

可以使用多路复用技术进行堆积叠加,增加服务能力
可以使用缓冲chan增加服务能力

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. )
  6. func GenerateIntA() chan int {
  7. ch := make(chan int, 10)
  8. go func() {
  9. for {
  10. ch <- rand.Int()
  11. }
  12. }()
  13. return ch
  14. }
  15. func GenerateIntB() chan int {
  16. ch := make(chan int, 10)
  17. go func() {
  18. for {
  19. ch <- rand.Int()
  20. }
  21. }()
  22. return ch
  23. }
  24. func GenerateInt() chan int {
  25. ch := make(chan int, 20)
  26. go func() {
  27. for {
  28. select {
  29. case ch <- <-GenerateIntA():
  30. case ch <- <-GenerateIntB():
  31. }
  32. }
  33. }()
  34. return ch
  35. }
  36. func main() {
  37. ch := GenerateInt()
  38. for i := 0; i < 100; i++ {
  39. fmt.Println(<-ch)
  40. }
  41. }

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

Close channel to broadcast 机制实现:

  1. package main
  2. import (
  3. "fmt"
  4. "math/rand"
  5. )
  6. func GenerateIntA(done chan struct{})chan int {
  7. ch := make(chan int )
  8. go func(){
  9. Lable:
  10. for {
  11. select {
  12. case ch<-rand.Int():
  13. case <-done:
  14. break Lable
  15. }
  16. }
  17. close(ch)
  18. }()
  19. return ch
  20. }
  21. func main(){
  22. done :=make(chan struct{})
  23. ch := GenerateIntA(done)
  24. fmt.Println(<-ch)
  25. fmt.Println(<-ch)
  26. close(done)
  27. fmt.Println(<-ch)
  28. fmt.Println(<-ch)
  29. fmt.Println(<-ch)
  30. fmt.Println(<-ch)
  31. }

4.可以更牛逼点,既要并发、缓冲,又有通知的生成器:

    1. package main
    2. import (
    3. "fmt"
    4. "math/rand"
    5. )
    6. func GenerateIntA(done chan struct{}) chan int {
    7. ch := make(chan int, 5)
    8. go func() {
    9. Lable:
    10. for {
    11. select {
    12. case ch <- rand.Int():
    13. case <-done:
    14. break Lable
    15. }
    16. }
    17. close(ch)
    18. }()
    19. return ch
    20. }
    21. func GenerateIntB(done chan struct{}) chan int {
    22. ch := make(chan int, 10)
    23. go func() {
    24. Lable:
    25. for {
    26. select {
    27. case ch <- rand.Int():
    28. case <-done:
    29. break Lable
    30. }
    31. }
    32. close(ch)
    33. }()
    34. return ch
    35. }
    36. func GenerateInt(done chan struct{}) chan int {
    37. ch := make(chan int)
    38. send := make(chan struct{})
    39. go func() {
    40. Lable:
    41. for {
    42. select {
    43. case ch <- <-GenerateIntA(send):
    44. case ch <- <-GenerateIntB(send):
    45. case <-done:
    46. send <- struct{}{}
    47. send <- struct{}{}
    48. break Lable
    49. }
    50. }
    51. close(ch)
    52. }()
    53. return ch
    54. }
    55. func main() {
    56. done := make(chan struct{})
    57. ch := GenerateInt(done)
    58. for i := 0; i < 10; i++ {
    59. fmt.Println(<-ch)
    60. }
    61. done <- struct{}{}
    62. for i := 0; i < 10; i++ {
    63. v := <-ch
    64. if v == 0 {
    65. return
    66. }
    67. fmt.Println(<-ch)
    68. }
    69. }

go并发设计模式 --资源生成器模式的更多相关文章

  1. 每天一个设计模式-7 生成器模式(Builder)

    每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...

  2. Java设计模式:生成器模式

    问题的提出: 有些类很容易创建对象,直接调用其构造方法,例如Student student = new Student("1001","zhang",21); ...

  3. 【设计模式】- 生成器模式(Builder)

    生成器模式 建造者模式.Builder 生成器模式 也叫建造者模式,可以理解成可以分步骤创建一个复杂的对象.在该模式中允许你使用相同的创建代码生成不同类型和形式的对象. 生成器的结构模式 生成器(Bu ...

  4. Java设计模式-Builder生成器模式

    概念: 生成器模式也称之为建造者模式.生成器模式的意图在于将一个复杂的构建与其表示相分离,构建与产品分离. UML: Ibuild接口清晰地反映了创建产品Product的流程. 生成器模式涉及4个关键 ...

  5. 面向对象设计模式_生成器模式详解(Builder Pattern)

    首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...

  6. 设计模式十: 生成器模式(Builder Pattern)

    简介 生成器模式属于创建型模式的一种, 又叫建造者模式. 生成器模式涉及4个关键角色:产品(Product),抽象生成器(builder),具体生成器(ConcreteBuilder),指挥者(Dir ...

  7. 面向对象设计模式_生成器模式解读(Builder Pattern)

    首先提出一个很容易想到应用场景: 手机的生产过程:手机有非常多的子件(部件),成千上万,不同品牌的手机的生产过程都是复杂而有所区别的,相同品牌的手机在设计上也因客户需求多样化,大到型号,小到颜色,是否 ...

  8. 设计模式--Builder生成器模式

    如果文章中哪里有问题,希望各位大哥大姐指出,小弟十分感激. 正文 什么是生成器模式? 生成器模式就是把生产对象的过程进一步抽取.细化.独立.以往我们生产对象,可能就是在一个小作坊里面从头做到尾.现在用 ...

  9. Head First设计模式之生成器模式

    一.定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.建造者模式是一种对象创建型模式. 二.结构 角色 Builder(抽象建造者):它为创建一个产品Product对象的 ...

随机推荐

  1. 第八周读书笔记(人月神话X月亮与六便士)——到底什么才是一个程序员的自我修养?

    写了这么久的读书笔记,涉及到问题大多是一些如何把软件工程做好,如何把自己的职业生涯做好.但总感觉逻辑链上缺了一环,亦即:我们为什么要把软件工程做好,我们成为一名优秀的职业生涯的意义到底在于什么?我觉得 ...

  2. Spring DATA MongoDB @DBref查询,or和and联合查询

    @DBref文档关联,在按该类型查询的时候,在字段名后加上关联表的字段名即可,如: Criteria.where("bloggroup.$id"), $id代表关联表的oid字段. ...

  3. 【从零开始】【Java】【3】改造成多模块项目

    闲聊 前几天还是太懒惰了,毕竟也是世界杯期间嘛,可以自我理解的,嘿嘿. 毕竟是从头开始,但是不一定适合所有新入门的人,所以搭框架啊.引入框架什么的,是占据最开始时间比较多的,代码层面的,可能要到靠后面 ...

  4. spring4+hibernate4+struts2环境搭建

    tomact配置请查看下面的文章 javaEE_maven_struts2_tomcat_first http://www.cnblogs.com/luotuoke/p/4543686.html po ...

  5. siblings() next() nextAll() nextUntil() prev() prevAll() prevUntil() 在 DOM 树中水平遍历

    $(document).ready(function(){ $("h2").siblings(); });拿到h2标签的所有的同级元素什么标签都可以 $(document).rea ...

  6. MongoDB_可视化工具Robo 3T

    Robo 3T可以对MongoDB进行可视化操作. Robo 3T安装 官网下载地址:https://robomongo.org/ 进入官网,点击下载,Studio 3T功能更全面,基础功能是免费的, ...

  7. DB2常用运维命令

    DB2是IBM公司推出关系型数据库管理系统.主要应用于银行.医院等大型机构.现今DB2主要包含以下三个系列:DB2 for Linux, UNIX and Windows(LUW) . DB2在Lin ...

  8. C语言提高 (7) 第七天 回调函数 预处理函数DEBUG 动态链接库

    链表就是一个结构体 指针指向自身结构体类型 双向链表插入的时候 先改变自身 再改变两边 双向链表删除的时候 先改变两边 再改变自己 逆序一个单向链表 回调函数 指向函数的指针 4链表的遍历回调用法 / ...

  9. 不能使用一般 Request 集合

    request.querystring("id"),不能request("id")

  10. django rest-farme-work 的使用(3)

    请求和响应 Requests and Responses 从这一片来说,我们将真正开始覆盖REST框架的核心.我们来介绍一些基本的构建块 Request objects REST框架引入了一个Requ ...