黄宽的blog

宁可十年不将军,不可一日不拱卒



并发concurrency

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没看懂以后再说

  golang

作者  :  黄宽

不耻最后,即使慢,驰而不息,纵会落后,纵令失败



About ME

about me

黄宽

我不想成为一个庸俗的人。十年百年后,当我们死去,质疑我们的人同样死去,后人看到的是裹足不前、原地打转的你,还是一直奔跑、走到远方的我?

友情链接