zoukankan      html  css  js  c++  java
  • go并发设计模式 --资源生成器模式

    1.简单的生成器

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


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

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

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


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

    Close channel to broadcast 机制实现:

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


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


      1. package main  
      2.   
      3. import (  
      4.     "fmt"  
      5.     "math/rand"  
      6. )  
      7.   
      8. func GenerateIntA(done chan struct{}) chan int {  
      9.     ch := make(chan int, 5)  
      10.   
      11.     go func() {  
      12.     Lable:  
      13.         for {  
      14.             select {  
      15.             case ch <- rand.Int():  
      16.             case <-done:  
      17.                 break Lable  
      18.             }  
      19.         }  
      20.         close(ch)  
      21.     }()  
      22.     return ch  
      23. }  
      24.   
      25. func GenerateIntB(done chan struct{}) chan int {  
      26.     ch := make(chan int, 10)  
      27.   
      28.     go func() {  
      29.     Lable:  
      30.         for {  
      31.             select {  
      32.             case ch <- rand.Int():  
      33.             case <-done:  
      34.                 break Lable  
      35.             }  
      36.         }  
      37.         close(ch)  
      38.     }()  
      39.     return ch  
      40. }  
      41.   
      42. func GenerateInt(done chan struct{}) chan int {  
      43.     ch := make(chan int)  
      44.     send := make(chan struct{})  
      45.     go func() {  
      46.     Lable:  
      47.         for {  
      48.             select {  
      49.             case ch <- <-GenerateIntA(send):  
      50.             case ch <- <-GenerateIntB(send):  
      51.             case <-done:  
      52.                 send <- struct{}{}  
      53.                 send <- struct{}{}  
      54.                 break Lable  
      55.             }  
      56.         }  
      57.         close(ch)  
      58.     }()  
      59.     return ch  
      60. }  
      61.   
      62. func main() {  
      63.     done := make(chan struct{})  
      64.     ch := GenerateInt(done)  
      65.   
      66.     for i := 0; i < 10; i++ {  
      67.         fmt.Println(<-ch)  
      68.     }  
      69.     done <- struct{}{}  
      70.     for i := 0; i < 10; i++ {  
      71.         v := <-ch  
      72.         if v == 0 {  
      73.             return  
      74.         }  
      75.         fmt.Println(<-ch)  
      76.     }  
  • 相关阅读:
    Bareword "mp4" not allowed while "strict subs" in use at (usersupplied code). ubuntu
    linux系统中如何删除空行
    linux系统中comm命令的用法
    Package libxml2.0 was not found in the pkgconfig search path
    ubuntu qt.qpa.xcb: could not connect to display
    R语言中管道运算符 %>%
    R语言中setdiff、intersect、union函数
    poly 定点于mesh定点的法线对其,非开做比较好,要是来回转很费时间, 界面还打伤元气
    rollout floater 界面的加减。
    看了脚本后才知道是怎么把三边转四边。
  • 原文地址:https://www.cnblogs.com/zhangym/p/6531220.html
Copyright © 2011-2022 走看看