并发concurrency-GOLANG

golang  - @amazeUI  - 2017-11-05 16:40:25

并发concurrency-GOLANG_第1张图片

func main() {

    fmt.Println(runtime.NumCPU())        //这里可以看到我的cpu核数,利用多核运行程序

    runtime.GOMAXPROCS(runtime.NumCPU()) //利用多核进行运行程序,当使用go时非阻塞时,执行顺序是随机的

    //不均匀,为了防止某些步骤未执行完毕main函数就退出需要配合另外一个包sync或者通过缓存通道

    //例如程序需要执行十次,那么每次存入一个值,外部用取到十次值才退出

    s := sync.WaitGroup{}

    s.Add(10) //增加十个任务

    for i := 0; i < 10; i += 1 {

        ww(&s, i)

    }

    s.Wait()             //等待十次任务清除才会继续下面的动作

    c := make(chan bool) //这是双向通道,还有一种是单项通道只可以取或存

    go Test(c)           //goroutine关键字,由官方实现的一个超级线程池

    //通过通信(通道)来实现共享内存channel。这里又讲到时间切片的概念,在多进程中也讲到过

    fmt.Println(1) //这里并非按照顺序执行,有可能Test函数先执行,如果将通道放置上一行,则是阻塞的操作

    <-c            //遇到这一行则会等待Test返回才会执行下一句

    //可以通过for range迭代这个通道,就会一直等待通道存入值信号,要用close关闭这个通道

    //通道缓存概念:make(chan bool 1)创建一个容量为1的通道,有缓存为异步的,无缓存是阻塞的

    //可以简单的理解为通道已经有个东西了,只要读就能读到东西,无缓存理解为通道没有东西,没有读到就会一直等待

    //

}

func Test(c chan bool) { //这里传递一个通道参数需要三个

    fmt.Println("go go go !!!")

    c <- true

}

func ww(s *sync.WaitGroup, i int) {

    fmt.Println(i)

    s.Done() //清除一次

}

select没看懂以后再说

你可能感兴趣的:(并发concurrency-GOLANG)