美文网首页
goroutine channel pipleline

goroutine channel pipleline

作者: 币来币往 | 来源:发表于2018-07-30 18:05 被阅读0次
    • goroutine 是go语言中最小的运行单位,比线程还小,一个进程可以有多个线程一个线程可以有多个goroutine,
    • channel是一个数据管道,用来在goroutine之间传递数据,一个goroutine往channel里面写数据,一个channel可以从中读数据。
    • pipeline pipeline是一个虚拟的概念,指的是将channel绑定到goroutine的过程

    Go使用fork-join 并发模型。

    • fork: fork部分指在主程序运行过程中创建的子分支, 每创建一个goroutine即创建了一个子分支;
    • join: join部分指子分支将在这里结束,即与主进程合并。sync.wait(), channels都会等待子分支结束

    select

    select 用法类似于switch语句,它允许你在多个chan中选择一个非阻塞的继续运行;
    如果所有的chan都阻塞则select语句阻塞;如果同时有多个chan非阻塞,则随机选择一个个

    package main
    
    import (
        "math/rand"
        "time"
        "fmt"
        "os"
        "strconv"
    )
    
    func gen(min, max int, createNumber chan int, end chan bool) {
        for {
            select {
            case createNumber <- rand.Intn(max-min) + min:
            case <-end:
                close(end)
                return
            case <- time.After(4 * time.Second):
                fmt.Println("\ntime.After()")
            }
        }
    }
    
    func main(){
        rand.Seed(time.Now().Unix())
        createNumber := make(chan int)
        end := make(chan bool)
        if len(os.Args) != 2{
            fmt.Println("Please give me an integer!")
            return
        }
    
        n, err := strconv.Atoi(os.Args[1])
    
        if err != nil{
            fmt.Println("Please input a valid integer!")
            return
        }
    
        go gen(0, n*2, createNumber, end)
    
        for i := 0; i < 10;i++{
            fmt.Print(<-createNumber, " ")
        }
    
        time.Sleep(5 * time.Second)
        fmt.Println("Exiting...")
        end <- true
    }
    

    相关文章

      网友评论

          本文标题:goroutine channel pipleline

          本文链接:https://www.haomeiwen.com/subject/jdvxvftx.html