Go GMP:并发编程实践


在这里插入图片描述
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。
在这里插入图片描述

  • 推荐:「stormsha的主页」👈,持续学习,不断总结,共同进步,为了踏实,做好当下事儿~

  • 专栏导航

    • Python系列: Python面试题合集,剑指大厂
    • Git系列: Git操作技巧
    • GO系列: 记录博主学习GO语言的笔记,该笔记专栏尽量写的试用所有入门GO语言的初学者
    • 数据库系列: 详细总结了常用数据库 mysql 技术点,以及工作中遇到的 mysql 问题等
    • 运维系列: 总结好用的命令,高效开发
    • 算法与数据结构系列: 总结数据结构和算法,不同类型针对性训练,提升编程思维

    非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨

    💖The Start💖点点关注,收藏不迷路💖

    📒文章目录

      • Goroutine:轻量级线程
        • Goroutine的创建与调度
        • Goroutine的同步与通信
      • Mutex:互斥锁
        • Mutex的使用
      • Pool:资源池
        • Pool的工作原理
        • Pool的使用
      • 并发模式:GMP
        • GMP模式的应用
      • 总结


内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
Go语言,以其简洁、高效和并发性能而闻名于世,是现代软件开发中不可或缺的一部分。Go的并发模型,Goroutine和Channel,是其核心特性之一。本文将深入探讨Go的并发编程模型,特别是GMP(Goroutine、Mutex、Pool)模式的使用技巧,旨在帮助开发者更好地理解和应用Go的并发特性。

Goroutine:轻量级线程

Go的Goroutine是一种轻量级的线程,由Go运行时管理。与传统的线程相比,Goroutine的创建和调度成本极低,这使得Go非常适合构建高并发的应用程序。

Goroutine的创建与调度

创建Goroutine非常简单,只需使用go关键字即可:

go myFunction()

Go运行时会为每个Goroutine分配一个很小的栈空间,并在必要时自动进行栈扩展。这种设计使得Goroutine的创建和切换非常快速。

Goroutine的同步与通信

Goroutine之间通过Channel进行通信。Channel可以看作是Goroutine之间的消息队列,用于在它们之间传递数据。使用Channel可以实现同步执行和数据共享。

ch := make(chan int)
go func() {
    ch <- 42
}()
v := <-ch

Mutex:互斥锁

在并发编程中,数据竞争是一个常见问题。Go提供了Mutex(互斥锁)来解决这个问题。Mutex确保同一时间只有一个Goroutine可以访问共享资源。

Mutex的使用

使用Mutex时,需要先通过sync.Mutex创建一个互斥锁实例,然后在访问共享资源之前调用Lock方法,访问完毕后调用Unlock方法释放锁。

var mu sync.Mutex
var shared int

func increment() {
    mu.Lock()
    shared++
    mu.Unlock()
}

Pool:资源池

Go的Pool是一种用于缓存和重用资源的机制,可以减少资源的创建和销毁开销,提高程序性能。

Pool的工作原理

Pool维护了一个资源列表,当需要资源时,可以从Pool中获取,使用完毕后归还。如果Pool中的资源不足,可以创建新的资源。

Pool的使用

创建一个Pool非常简单,使用sync.Pool即可:

p := sync.Pool{
    New: func() interface{} {
        return new(MyType)
    },
}

使用Pool时,可以通过Get方法获取资源,使用完毕后通过Put方法归还。

v := p.Get().(*MyType)
// 使用v进行操作
p.Put(v)

并发模式:GMP

结合Goroutine、Mutex和Pool,我们可以构建高效且安全的并发应用程序。GMP模式是一种常见的并发编程模式,它利用了Go的这些特性来实现高效的并发处理。

GMP模式的应用

假设我们有一个需要并发处理大量数据的任务,我们可以创建一个Goroutine池来并发处理数据,使用Mutex来保护共享资源,使用Pool来管理资源的创建和销毁。

func process(data []int, ch chan int) {
    for _, v := range data {
        // 处理数据
        ch <- v
    }
    close(ch)
}

func main() {
    var wg sync.WaitGroup
    data := make([]int, 10000)
    ch := make(chan int, 10000)
    p := &sync.Pool{
        New: func() interface{} {
            return new(int)
        },
    }

    for i := 0; i < 10; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for v := range ch {
                // 使用Pool获取资源
                pVal := p.Get().(*int)
                *pVal = v
                // 处理逻辑
                // ...
                // 使用完毕后归还资源
                p.Put(pVal)
            }
        }()
    }

    go func() {
        for _, v := range data {
            go func(v int) {
                wg.Add(1)
                defer wg.Done()
                process([]int{v}, ch)
            }(v)
        }
        wg.Wait()
        close(ch)
    }()

    wg.Wait()
}

总结

Go的并发模型是其设计哲学的精髓之一,通过GMP模式,开发者可以构建出既高效又安全的并发应用程序。理解并掌握Goroutine、Mutex和Pool的使用,将极大地提升你的并发编程能力。希望本文能够帮助你更深入地理解Go的并发特性,并在实际开发中运用这些知识。


🔥🔥🔥道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

💖The End💖点点关注,收藏不迷路💖

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/766302.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

速锐得解码汽车以太网技术特点接口定义数据传输及应用

在当前的汽车工业中&#xff0c;随着技术的飞速发展&#xff0c;车载网络技术也在不断进步与更新。其中&#xff0c;具备以太网的车型已成为一个新兴趋势&#xff0c;这主要归功于车载以太网技术在车内带宽需求较高的系统上的应用&#xff0c;如高级驾驶辅助系统&#xff08;AD…

RabbitMQ 消息传递

消息何去何从 mandatory和immediate是channel.basicPublish方法中的两个参数&#xff0c;他们都有当消息传递过程中不可达目的地时将消息返回给生产者的功能。RabbitMQ提供的备份交换器可以将未能被交换器路由的消息&#xff08;没有绑定队列或者没有匹配的绑定&#xff09;存…

java基于ssm+jsp 二手交易平台网站

1商家能模块 商家首页&#xff0c;在商家首页页面可以查看个人中心、商品分类管理、商品信息管理、订单信息管理、订单配送管理信息&#xff0c;如图1所示。 图1商家首页界面图 个人中心&#xff0c;用户通过个人中心可以查看用户名、用户姓名、头像、性别、手机号码、邮箱等信…

【C语言】register 关键字

在C语言中&#xff0c;register关键字用于提示编译器将变量尽量存储在CPU的寄存器中&#xff0c;而不是在内存中。这是为了提高访问速度&#xff0c;因为寄存器的访问速度比内存快得多。使用register关键字的变量通常是频繁使用的局部变量。 基本用法 void example() {regist…

第三届行为科学与应用心理学国际会议(BSAP2024)

会议日期&#xff1a;2024年9月13-15日 会议地点&#xff1a;马来西亚 吉隆坡 会议官网&#xff1a;https://www.iaast.cn/meet/home/Bx116rPM 出版检索&#xff1a;SSCI&SCI 【支持单位】 苏库尔IBA大学 苏库尔IBA大学.png 【大会主席】 【出版与检索】

​​​​​​​​​​​​​​Spark Standalone集群环境

目录 Spark Standalone集群环境 修改配置文件 【workers】 【spark-env.sh】 【配置spark应用日志】 【log4j.properties】 分发到其他机器 启动spark Standalone 启动方式1&#xff1a;集群启动和停止 启动方式2&#xff1a;单独启动和停止 连接集群 【spark-shel…

Librechat快速部署指南

引言 Github的开源免费程序里&#xff0c;Librechat作为AI对话使用&#xff0c;现阶段可谓是最佳选择&#xff0c;配合聚合API >>进行使用&#xff0c;能够保证成本最低&#xff0c;自由度最高&#xff0c;私密性最强&#xff0c;功能丰富且界面美观&#xff0c;如此以来…

压缩pdf文件大小,压缩pdf文件大小软件哪个好

在数字化时代&#xff0c;PDF文件因其卓越的跨平台兼容性和稳定性而成为工作与学习的好帮手。然而&#xff0c;当PDF文件体积过大时&#xff0c;传输和存储便成了一项挑战。别担心&#xff0c;本文将为你揭秘如何快速压缩PDF文件&#xff0c;让你的文档轻装上路&#xff01; 压…

【有为己之心方能克己】

私欲会让人难受&#xff0c;为了自己舒服而去拔除&#xff0c;去除私欲小我&#xff0c;就可以为自己展现大我 “人不为己天诛地灭”&#xff0c;其实这句话不是自私自利的意思&#xff0c; 原意是&#xff1a;人如果不修为自己&#xff0c;不为那个真己而活&#xff0c;不活出…

智能井盖监测系统:守护城市安全的新防线

​ ​​在快速发展的现代都市中&#xff0c;井盖作为连接地上与地下世界的“隐形门”&#xff0c;其安全状态直接关系到市民的生命财产安全。随着物联网、大数据及人工智能技术的飞速发展&#xff0c;智能井盖监测系统的出现为解决传统井盖管理难题提供了创新方案&#xff0…

ROS2 分布式 及 ssh远程控制 和 上传文件夹

问题1. 多台计算机连接同一wifi后 &#xff0c;运行ROS2的小乌龟案例&#xff0c;自己的计算机&#xff0c;无法控制其他电脑的小乌龟 按照正常的情况来说&#xff0c;ROS2是DDS的自发现通信机制&#xff0c;只要处在同一wifi网络中&#xff0c; A计算机执行启动小乌龟的命…

Android项目框架

Android项目基于Android Studio开发&#xff0c;Android Studio使用Gradle作为项目构建工具。新建工程后可以看到如图所示目录结构&#xff0c;将Android切成Project可以看到完整的Android工程目录结构&#xff0c;如图所示。 图1-2 Android项目目录结构 app目录是一个典型的…

Jmeter 入门指南:从零开始学习

JMeter 是一个非常流行的开源工具&#xff0c;用于进行负载测试。它支持多种网络协议&#xff0c;包括 HTTP、FTP、SMTP、JMS、SOAP、JDBC 等&#xff0c;使其成为在多种应用环境中检测性能瓶颈的理想选择。本文将详细介绍如何利用 JMeter 进行高效的接口自动化测试。 创建和执…

01 Docker 概述

目录 1.Docker简介 2.传统虚拟机 vs 容器 3.Docker运行速度快的原因 4.Docker基本组成三要素 5.Docker 平台架构 入门版 架构版 1.Docker简介 Docker是基于Go语言实现的云开源项目。 Docker的主要目标是&#xff1a;Build, Ship and Run Any App, Anywhere&#xff0c…

python3中的pdb使用

目录 1 介绍 1 介绍 有脚本文件main.py&#xff0c;其内容如下&#xff0c; import os import sys if __name__ "__main__":n 10for i in range(n):j i 10j j * j if j % 2 0:print("j is even!")else:print("j is odd.")n 20s 0 fo…

和鲸“101”计划领航!和鲸科技携手北中医,共话医学+AI 实验室建设及创新人才培养

为进一步加强医学院校大数据管理与应用、信息管理与信息系统&#xff0c;医学信息工程等专业建设&#xff0c;交流实验室建设、专业发展与人才培养经验&#xff0c;6 月 22 日&#xff0c;由北京中医药大学&#xff08;简称“北中医”&#xff09;主办&#xff0c;上海和今信息…

windows远程连接无法复制文件

windows远程桌面无法复制文件 解决方案 打开任务管理器管理器,在详细信息界面,找到rdpclip.exe进程&#xff0c;选中并点击结束任务&#xff0c;杀死该进程。 快捷键 win r 打开运行界面&#xff0c;输入 rdpclip.exe &#xff0c;点击确定运行。即可解决无法复制文件问题。…

QStringListModel 绑定到QListView

1.QStringListModel 绑定到listView&#xff0c;从而实现MV模型视图 2.通过QStringListModel的新增、删除、插入、上下移动&#xff0c;listView来展示出来 3.下移动一行&#xff0c;传入curRow2 的个人理解 布局 .h声明 private:QStringList m_strList;QStringListModel *m_m…

单向链表结构

链表结构简介 链表结构是一种用比较特殊的数据结构类型&#xff0c;它也是线性数据结构中的一种&#xff0c;但是与栈结构等线性数据结构不同&#xff0c;它的内部结构并不是一个简单的存储空间&#xff0c;而是一个带有指向性质的单元。要理解链表结构要弄清楚两个问题&#x…

仰邦BX.K协议对接

背景 使用BX 6K控制卡控制诱导屏显示剩余车位数&#xff0c;由于控制卡和服务端不在一个局域网内&#xff0c;所以不能使用官网提供的案例&#xff0c;官网提供的案例为控制卡为TCP Server&#xff0c;服务端为TCP Client&#xff0c;因此需要开发此程序&#xff0c;服务端左右…