美文网首页
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