- 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
}
网友评论