有一天,一个人问了我此问题,回头仔细翻阅了一下资料,仔细的想了一下,这个问题的解决有两种方案。
方案一:
也是推荐方案,也是官方推荐方案,涉及到一个写并发经常关注的模块sync模块,利用里面的sync.WaitGroup去做
代码如下:
package main
import(
        "fmt"
        "sync"
        "time"
        "runtime"
)
var wg sync.WaitGroup //定义一个同步等待的组
func main() {
    maxProcs := runtime.NumCPU() //获取cpu个数
    runtime.GOMAXPROCS(maxProcs) //限制同时运行的goroutines数量
    for i:=0;i<10;i++{
            wg.Add(1)//为同步等待组增加一个成员
            go Printer(i)//并发一个goroutine
    }
    wg.Wait() //阻塞等待所有组内成员都执行完毕退栈
    fmt.Println("WE DONE!!!")
}
//定义一个Printer函数用于并发
func Printer(a int)(){
        time.Sleep(2000 * time.Millisecond)
        fmt.Printf("i am %d\n",a)
        defer wg.Done()
}

方案二:
思路也不绕路,利用的channel的阻塞机制,直接上代码了。
package main
import(
        "fmt"
        "time"
        "runtime"
)
var num=14 //定义一工并发多少数量
var cnum chan int
func main(){
   maxProcs := runtime.NumCPU()// 获取cpu个数
    runtime.GOMAXPROCS(maxProcs)//限制同时运行的goroutines数量
    cnum=make(chan int,num) //make一个chan,缓存为num
    for i:=0;i<num;i++{
            go Printer(i)
    }
// 下面这个for循环的意义就是利用信道的阻塞,一直从信道里取数据,直到取得跟并发数一样的个数的数据,则视为所有goroutines完成。
    for i:=0;i<num;i++{
            <-cnum
    }
    fmt.Println("WE DONE!!!")
}

func Printer(a int)(){
        time.Sleep(2000 * time.Millisecond)
        fmt.Printf("i am %d\n",a)
        cnum <- 1 //goroutine结束时传送一个标示给信道。
}

最新文章

  1. listView当中有嵌套了有onClickListener的控件时ListView自身的onItemClick无响应的解决方案
  2. springmvc之图片上传
  3. SQL: enable sa Account in SQL Server
  4. 【洛谷 p3386】模板-二分图匹配(图论)
  5. Jenkins入门系列之——00答疑解惑
  6. HTML+CSS学习笔记 (14) - 单位和值
  7. Android更改桌面应用程序launcher的两种方式
  8. Poj 1013 Counterfeit Dollar / OpenJudge 1013(2692) 假币问题
  9. UVA 10325 lottery 容斥原理
  10. Ansible@一个高效的配置管理工具--Ansible configure management--翻译(八)
  11. CTP API开发期货自动交易平台概论
  12. Template - Strategy
  13. shell脚本三——正则表达式
  14. 「Android」系统架构概述
  15. 纯手写AJAX
  16. Android开之在非UI线程中更新UI
  17. Rest架构以及什么是Restful
  18. Codeforces807 C. Success Rate 2017-05-08 23:27 91人阅读 评论(0) 收藏
  19. webpack开发工具
  20. 【BZOJ】【4066】简单题(强制在线)

热门文章

  1. Codeforces 1213D Equalizing by Division
  2. jQuery_val()操作
  3. sqli-labs(45)
  4. 项目配置 xml文件时 报错提示(The reference to entity &quot;useSSL&quot; must end with the &#39;;&#39; delimiter.)
  5. 【转】Diamond -- 分布式配置中心
  6. ubuntu16.04修改host上外網
  7. MongoDB中的_id和ObjectId
  8. R实现pm2.5地图数据展示
  9. koa 基础(一)新建/启动 项目
  10. leetcode-easy-others-191. Number of 1 Bits-NO