goroutine channel pipleline

2018-07-30  本文已影响0人  币来币往

Go使用fork-join 并发模型。

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
}
上一篇 下一篇

猜你喜欢

热点阅读