并发 concurrency golang

与子笑 · · 292 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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() //清除一次
    }

原文链接:并发concurrency-GOLANG


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:与子笑

查看原文:并发 concurrency golang

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

292 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传