并发concurrency-GOLANG

字数 509阅读 26846

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

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

推荐阅读更多精彩内容

  • fmt格式化字符串 格式:%[旗标][宽度][.精度][arg索引]动词旗标有以下几种:+: 对于数值类型总是输出...
  • Notes Section 2, Program Structure nested block in if-els...
  • pdf下载地址:Java面试宝典 第一章内容介绍 20 第二章JavaSE基础 21 一、Java面向对象 21 ...
  • 使用go1.10版本,在liteIde里开发。 1,变量声明后必须使用,不然编译不过(全局变量可以不用)。 2,变...
  • 明天中午的便当里缺一位荤菜,现在是夜里十一点半了,拉开冰箱,用我的笨手翻了翻,最终我打算让可乐鸡翅参演。 卖相实属...