当前位置:

首页 > 编程开发 > Golang函数并发编程中通道的类型和规则

Golang函数并发编程中通道的类型和规则

通道是Go语言中用于在并发函数间安全传递数据的通信机制,提供的数据竞争保护避免直接访问共享内存。通道类型包括无缓冲通道(chanT)和缓冲通道(chanT,int)。规则包括发送值(<-chanT),接收值(chanT<-),关闭通道(close(chan)),选择性接收或发送(select)。实战中,通道可用于并行计算,例如计算素数的程序中使用无缓冲输入通道,缓冲输出通道,以及用于信号计算完成的无缓冲通道。

本文目录

    通道是 Go 语言中用于在并发函数间安全传递数据的通信机制,提供的数据竞争保护避免直接访问共享内存。通道类型包括无缓冲通道(chan T)和缓冲通道(chan T, int)。规则包括发送值(<-chan T),接收值(chan T<-),关闭通道(close(chan)),选择性接收或发送(select)。实战中,通道可用于并行计算,例如计算素数的程序中使用无缓冲输入通道,缓冲输出通道,以及用于信号计算完成的无缓冲通道。

    Golang函数并发编程中通道的类型和规则

    Go 语言函数并发编程中的通道类型和规则

    通道是 Go 语言中用于在并发函数之间安全地传递数据的通信机制。它们提供了一个抽象层,使函数无需直接访问共享内存,从而避免了数据竞争。

    通道类型

    • 无缓冲通道 (chan T):此类通道没有内部缓冲区,因此发送方和接收方必须同时处于就绪状态才能进行通信。
    • 缓冲通道 (chan T, int):此类通道有一个指定大小的内部缓冲区,用于存储值。它允许发送方在接收方未准备好接收时发送值,反之亦然。

    通道规则

    • 发送值:使用 send 操作符 (<-) 将值发送到通道。必须先使用 <-chan 锁定通道,然后再发送值。
    • 接收值:使用 receive 操作符 (->) 从通道接收值。与发送值类似,必须先使用 chan<- 锁定通道,然后再接收值。
    • 关闭通道:使用 close(chan) 关闭通道。关闭后,无法再向通道发送值,但可以继续接收已发送的值。
    • 通道容量:缓冲通道有一个指定的最大容量,由创建时指定的第二个参数确定。如果通道已满,发送方将阻塞,直到有空间可用。
    • 选择:select 语句允许从多个通道进行选择性接收或发送。它提供了事件驱动的并发编程模型。

    实战案例

    考虑一个计算素数的程序:

    package main
    
    import (
        "fmt"
        "math"
        "sync"
        "time"
    )
    
    // 工作单元
    type WorkUnit struct {
        n        uint64
        isPrime  bool
        finished chan bool
    }
    
    // 素数计算函数
    func isPrime(n uint64) bool {
        if n <= 1 {
            return false
        }
        for i := uint64(2); i <= uint64(math.Sqrt(float64(n))); i++ {
            if n%i == 0 {
                return false
            }
        }
        return true
    }
    
    // 工作器函数
    func worker(in, out chan *WorkUnit, wg *sync.WaitGroup) {
        defer wg.Done()
        for unit := range in {
            unit.isPrime = isPrime(unit.n)
            close(unit.finished)
            out <- unit
        }
    }
    
    func main() {
        // 输入通道
        in := make(chan *WorkUnit)
        // 输出通道
        out := make(chan *WorkUnit)
    
        // 初始化工作单元
        units := make([]*WorkUnit, 500000)
        for i := range units {
            units[i] = &WorkUnit{
                n:        uint64(i),
                finished: make(chan bool),
            }
        }
    
        // 启动工作器
        wg := &sync.WaitGroup{}
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go worker(in, out, wg)
        }
    
        // 将工作单元推送到输入通道
        start := time.Now()
        for _, unit := range units {
            in <- unit
        }
        close(in)
    
        // 从输出通道接收结果
        for unit := range out {
            <-unit.finished
        }
        elapsed := time.Since(start)
    
        fmt.Printf("Took %s\n", elapsed)
    }

    在这个示例中:

    • in 通道是无缓冲通道,用于将工作单元发送到工作器函数。
    • out 通道是缓冲通道,用于将计算结果传回主函数。
    • finished 通道是一个无缓冲通道,用于在工作器函数完成计算后向主函数发出信号。

    该程序演示了如何在 Go 中使用通道来实现并发计算,有效地利用了多个 CPU 核心。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 通道
    相关文章 更多
    photoshop通道有哪些
    photoshop通道有哪些

    想知道Photoshop通道有哪些?本文不讲复杂理论,直接带你打开【通道】面板,看清红绿蓝通道如何组成色彩,以及Alpha通道如何保存选区。通过简单的黑白对比和选区加载操作,直观掌握通道的实际用途。

    Photoshop通道是什么:颜色通道与Alpha通道的区别及作用
    Photoshop通道是什么:颜色通道与Alpha通道的区别及作用

    深入解析Photoshop通道概念,区分颜色通道(记录色彩)与Alpha通道(记录选区/透明度)。通过具体操作步骤,演示如何查看通道细节及利用Alpha通道保存复杂选区,提升图像处理效率。

    photoshop通道作用、功能及用途
    photoshop通道作用、功能及用途

    深入解析Photoshop通道的作用与功能,涵盖RGB/CMYK颜色通道原理、Alpha通道选区存储技巧及专色通道应用,适合初学者快速掌握通道面板的核心用途。

    photoshop通道是什么
    photoshop通道是什么

    初学者指南:解析 Photoshop 通道面板结构,演示如何利用 RGB 通道对比度进行抠图,以及如何创建和使用 Alpha 通道保存选区与辅助调色。

    photoshop通道的作用
    photoshop通道的作用

    深入解析Photoshop通道的作用,通过头发丝抠图和局部调色实例,演示如何利用RGB颜色通道提取高光选区,以及如何使用Alpha通道存储和编辑复杂蒙版,提升修图效率与精度。

    在photoshop中有哪几种通道
    在photoshop中有哪几种通道

    了解Photoshop中的颜色通道、Alpha通道和专色通道,学习如何通过通道面板进行高级图像编辑、选区制作和印刷输出准备。

    photoshop通道和蒙版在哪
    photoshop通道和蒙版在哪

    找不到Photoshop的通道和蒙版?本文直接展示它们在软件界面中的具体位置,包括如何通过窗口菜单调出隐藏面板,以及如何在图层面板中创建和管理蒙版。

    关于CPU编程—无锁编程
    关于CPU编程—无锁编程

    无锁编程与分布式编程,谁更适合多核CPU? 前一篇文章我们分析了多核系统中三种典型锁竞争的加速比情况,其中分布式锁竞争的加速比与CPU核数成正比,性能表现相当亮眼。近年来,无锁编程在学术界备受关注。那么,一个很自然的问题是:采用无锁编程能否获得更优的加速比?或者说,它是否比分布式编程更适合多核CPU

    Python并发与并行怎么实现?
    Python并发与并行怎么实现?

    答案:Python中并发指任务交错执行,看似同时运行,而并行指任务真正同时执行;由于GIL限制,多线程无法实现CPU并行,仅适用于I/O密集型任务,而真正的并行需依赖multiprocessing或多核支持的底层库。

    Golang指针与值类型并发使用技巧
    Golang指针与值类型并发使用技巧

    在Go并发编程中,共享数据修改需用指针传递以确保多goroutine操作同一变量,如通过互斥锁更新计数器;只读数据推荐值传递,避免竞争且提升安全性,适用于小结构体或配置参数;大对象为避免拷贝开销常使用指针,但需保证只读或配合RWMutex同步;通道传输时,小对象或需隔离用值,大对象或需共享状态用指针,但须控制访问权限;关键在于根据共享需求、数据大小和生命周期合理选择,优先采用不可变数据和最小共享原则降低竞态风险。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。