因为go语言层面支持并发,所以面试中经常会问到并发的问题,比如说控制go并发数量的方式有哪些?下面是我个人整理的两个例子:

func waitGroup() {    count := 10    wg := sync.WaitGroup{}    for i := 0; i < count; i++ {        wg.Add(1)        go func(j int) {            fmt.Print(j)            wg.Done() // 也可使用 wg.Add(-1)        }(i)    }    wg.Wait()}

上面主要用到的是go中sync包下的waitGroup,这也是在工作中比较常见的实现方式,关键点就是把握好Add方法的位置,Wait方法则是等待所有的协程执行完毕

func channel() {    count := 10 // 最大支持并发    sum := 100 // 任务总数    c := make(chan struct{}, count) // 控制任务并发的chan    sc := make(chan struct{}, sum) // 控制任务总数的chan    defer close(c)    defer close(sc)    for i:=0; i<sum;i++{        c <- struct{}{} // 作用类似于waitgroup.Add(1)        go func(j int) {            fmt.Println(j)            <- c // 执行完毕,释放资源            sc <- struct {}{} // 记录到执行总数里        }(i)    }    for i:=sum; i>0;i-- {        <- sc    }}

上面的例子用到的是go中的channel,利用channel阻塞的特性和带缓冲的channel来实现控制并发数量,其中sc这个channel是可以去掉的,例子里用只是为了防止主程序退出之后,没有全部输出,正常工作中,程序一般都是阻塞式的,所以可以去掉。

更多相关知识请关注go语言教程栏目

更多相关文章

  1. 关于go值传递和地址传递的例子
  2. 利用XML实现通用WEB报表打印实际使用中的例子
  3. XML教程-用一个例子来学习XML的语法的详情
  4. XML Schema的一个简单的例子
  5. 数据会说谎的真实例子有哪些
  6. Ansible 之 ansible-playbook基础入门例子
  7. 再来 6 个例子教你重构 Python 代码
  8. f-string 竟然能有 73 个例子,我要学习下
  9. 一个例子带你入门Python装饰器

随机推荐

  1. 关于CentOS6.x/6.5/6.4/6.3/6.2/7.x 64位
  2. 正则表达式中模式修正符作用详解
  3. PHP中的global关键字用法
  4. 深入理解PHP中七个预定义接口
  5. PHP自定义函数+系统函数库(代码示例)
  6. 关于PHP框架中.env文件的加载过程
  7. php中比较两个数组差异的方法
  8. 如何将smarty安装到MVC架构中(代码示例)
  9. PHP的一些安全设置(优化)
  10. PHP中字符串处理的一些常用函数