0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用channel控制协程数量

马哥Linux运维 来源:稀土掘金技术社区 作者:六号积极分子 2022-09-19 15:06 次阅读

协程

goroutine 是轻量级线程,调度由 Go 运行时进行管理的。Go 语言的并发控制主要使用关键字 go 开启协程 goroutine。Go 协程(Goroutine)之间通过信道(channel)进行通信,简单的说就是多个协程之间通信的管道。信道可以防止多个协程访问共享内存时发生资源争抢的问题。语法格式:

// 普通函数创建 goroutinego 函数名(参数列表)
//匿名函数创建 goroutinego func(参数列表){    //函数体}(调用参数列表)

		

协程可以开启多少个?是否有限制呢?

func testRoutine() {    var wg sync.WaitGroup    for i := 0; i < math.MaxInt32; i++ {        wg.Add(1)        go func(i int) {            defer wg.Done()            fmt.Printf("并发数量:%d/n", i)            time.Sleep(time.Second)        }(i)    }    wg.Wait()}

		

以上代码开启了 math.MaxInt32个协程的并发,执行后可以看到结果直接 panic:“panic: too many concurrent operations on a single file or socket (max 1048575)”。整个并发操作超出了系统最大值。

控制协程数量

sync 同步机制

使用 sync.WaitGroup 启动指定数量的协程 goroutine。

func testRoutine() {    var wg = sync.WaitGroup{}
    taskCount := 5 // 指定并发数量    for i := 0; i < taskCount; i++ {        wg.Add(1)        go func(i int) {            fmt.Println("go func ", i)            wg.Done()        }(i)    }    wg.Wait()}

		

如果 taskcount 设置的很大超出了限制的,则其还是没有控制到并发数量。可以优化下设计,类似池的设计思想,通过允许最大连接数控制量,当超出了数量就需要等待释放,有空闲的连接的时候才可以继续执行。

func testRoutine() {    task_chan := make(chan bool, 3) //100 为 channel长度    wg := sync.WaitGroup{}    defer close(task_chan)    for i := 0; i < math.MaxInt; i++ {        wg.Add(1)        fmt.Println("go func ", i)        task_chan <- true        go func() {                <-task_chan                defer wg.Done()        }()    }
    wg.Wait()}

		

  • 创建缓冲区大小为 3 的 channel,在没有被接收的情况下,至多发送 3 个消息则被阻塞。通过 channel 控制每次并发的数量。
  • 开启协程前,设置 task_chan <- true,若缓存区满了则阻塞
  • 协程任务执行完成后就释放缓冲区
  • 等待所有的并发都处理结束后则函数结束。其实可以不使用 sync.WaitGroup。因使用 channel 控制并发处理的任务数量可以不用使用等待并发处理结束。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Channel
    +关注

    关注

    0

    文章

    31

    浏览量

    11707
  • 线程
    +关注

    关注

    0

    文章

    489

    浏览量

    19500
  • go语言
    +关注

    关注

    1

    文章

    157

    浏览量

    8930

原文标题:使用 channel 控制并发数量

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ARM系列-P Channel介绍

    ARM定义了两个低功耗接口(Low Power Interface),用于低功耗控制握手,分别是Q-Channel和P-Channel
    的头像 发表于 10-26 14:42 766次阅读
    ARM系列-P <b class='flag-5'>Channel</b>介绍

    什么是叫压缩倍频

    *18=108DB,这远远超出磁带的动态范围.为此要记录视频信号就要压缩倍频,在录象机中是采用将视频亮度信号进行调频记录方式,通过控制调制指数使FM的频偏在1.1MHZ--7.8MHZ内,这样使倍频减少到少于3,因而适应磁带
    发表于 09-17 08:36

    请问运算是交给28335处理器FPU,是DSP自行控制吗?

    本帖最后由 一只耳朵怪 于 2018-6-7 14:30 编辑 运算是否交给28335处理器FPU,是DSP自行控制吗? 没用过双核的东西。见笑了
    发表于 06-07 10:32

    让FPGA处理器实现代码加速的方法有哪些?

    当今的设计工程师受到面积、功率和成本的约束,不能采用GHz级的计算机实现嵌入式设计。在嵌入式系统中,通常是由相对数量较少的算法决定最大的运算需求。使用设计自动化工具可以将这些算法快速转换到硬件处理器中。然后,处理器可以有效地
    发表于 09-03 06:26

    FPGA处理的优势有哪些?如何去使用FPGA处理?

    有谁来阐述一下FPGA处理的优势有哪些?如何去使用FPGA处理?怎样借助FPGA处理去提升性能?怎样借助FPGA嵌入式处理去降低成本?从C程序到系统门指的是什么?采用FPGA
    发表于 04-14 06:07

    培训 精选资料分享

    第一次任务加入电培训第一个星期加入电培训第一个星期第一个星期并没有去实验室,但是依然有任务,发一次博客,这个星期第一次运行了单片机并且响起了音乐,非常开心。
    发表于 07-19 08:30

    和线程有什么区别

    和线程的区别和线程的共同目的之一是实现系统资源的上下文调用,不过它们的实现层级不同;线程(Thraed)是比进程小一级的的运行单位,多线程实现系统资源上下文调用,是编程语言交付
    发表于 12-10 06:23

    怎样使用C语言去实现Linux系统

    Linux系统编程练手项目:使用C语言实现 6年嵌入式开发经验,在多家半...
    发表于 12-23 06:58

    什么是多任务系统?FreeRTOS任务与简析

    功能,初学者必须先掌握——任务的创建、删除、挂起和恢复等操作。本章节分为如下几部分:*什么是多任务系统*FreeRTOS任务与*初次使用*任务状态*任务优先级*任务实现*任务控制块*任务堆栈一、什么是多任务系统单片机一般都是
    发表于 02-18 06:38

    小白求助怎样去使用ARM处理器呢

    困难,因此高性能的ARM处理器接口仅限于片上使用。最常使用的处理器是用于控制片上功能的系统处理器,例如控制ARM720上的高速缓存Ca
    发表于 04-24 09:36

    聊一聊如何在仿真中如何“多进程”时间管理

    测试的构建也是必不可少的。而在SpinalHDL的仿真框架中,同样,也会使用fork关键字来发起“多”进程访问。不一样的fork在SpinalHDL的仿真架构里,其基础是基于的(与cocotb思路
    发表于 06-29 16:11

    什么是Channel coding

    什么是Channel coding  英文缩写: Channel coding 中文译名: 信道编码,纠错编码 分  类: 运营与支撑 解  释:
    发表于 02-22 17:22 1515次阅读

    什么是Fibre Channel

    什么是Fibre Channel  英文缩写: Fibre Channel 中文译名: 光纤信道 分  类: 网络与交换 解  释: 一种把面向
    发表于 02-23 10:08 1587次阅读

    如何使用 Tokio 模块的Channel

    Channel 是一种在多线程环境下进行通信的机制,可以让线程之间互相发送消息和共享数据。Rust 语言中的 Tokio 模块提供了一种异步的 Channel 实现,使得我们可以在异步程序中方
    的头像 发表于 09-19 15:38 334次阅读

    ARM系列-P Channel简析

    ARM定义了两个低功耗接口(Low Power Interface),用于低功耗控制握手,分别是Q-Channel和P-Channel
    的头像 发表于 10-24 10:49 866次阅读
    ARM系列-P <b class='flag-5'>Channel</b>简析