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 intfunc 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.WaitGroupdata := 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💖点点关注,收藏不迷路💖

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【工具】VS Code使用global插件实现代码跳转

&#x1f41a;作者简介&#xff1a;花神庙码农&#xff08;专注于Linux、WLAN、TCP/IP、Python等技术方向&#xff09;&#x1f433;博客主页&#xff1a;花神庙码农 &#xff0c;地址&#xff1a;https://blog.csdn.net/qxhgd&#x1f310;系列专栏&#xff1a;善假于物&#…

粤港联动,北斗高质量国际化发展的重要机遇

今年是香港回归27周年&#xff0c;也是《粤港澳大湾区发展规划纲要》公布5周年&#xff0c;5年来各项政策、平台不断为粤港联动增添新动能。“十四五”时期的粤港澳大湾区&#xff0c;被国家赋予了更重大的使命&#xff0c;国家“十四五”《规划纲要》提出&#xff0c;以京津冀…

时序约束(二): input delay约束和output delay约束

一、input delay约束 在千兆以太网数据收发项目中&#xff0c;RGMII的数据输入方式为DDR&#xff0c;源同步输入方式&#xff0c;可以用之前提到的分析模型进行约束。 在时序约束原理中我们提到&#xff0c;input delay约束的就是发射沿lunch到数据有效的延时&#xff0c;根据…

Linux:网络基础1

文章目录 前言1. 协议1.1 为什么要有协议&#xff1f;1.2 什么是协议&#xff1f; 2. 网络2.1 网络通信的问题2.2 网络的解决方案——网络的层状结构2.3 网络和系统的关系2.4 网络传输基本流程2.5 简单理解IP地址2.6 跨网络传输 总结 前言 在早期的计算机发展中&#xff0c;一开…

【华为战报】5月、6月HCIP考试战报!

华为认证&#xff1a;HCIA-HCIP-HCIE 点击查看&#xff1a; 【华为战报】4月 HCIP考试战报&#xff01; 【华为战报】2月、3月HCIP考试战报&#xff01; 【华为战报】11月份HCIP考试战报&#xff01; 【HCIE喜报】HCIE备考2个月丝滑通关&#xff0c;考试心得分享&#xff…

7.x86游戏实战-C++实现跨进程读写-跨进程写内存

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;6.x86游戏实战-C实现跨进程读写-通过基址读取人物状态标志位 上一个内容通过基…

深层神经网络

深层神经网络 深层神经网络 深度神经网络&#xff08;Deep Neural Networks&#xff0c;DNN&#xff09;可以理解为有很多隐藏层的神经网络&#xff0c;又被称为深度前馈网络&#xff08;DFN&#xff09;&#xff0c;多层感知机&#xff08;Multi-Layer perceptron&#xff0c…

ghost恢复?电脑文件恢复如何操作?电脑数据恢复工具!5款!

在数字化时代&#xff0c;电脑数据的价值日益凸显。然而&#xff0c;数据丢失、误删、系统崩溃等问题时有发生&#xff0c;给个人和企业带来巨大损失。本文将为您详细介绍Ghost恢复方法&#xff0c;同时推荐五款高效的电脑数据恢复工具&#xff0c;助您轻松应对数据丢失的困扰。…

使用归档实用工具怎么打不开 mac上好用的解压软件 归档实用工具打不开怎么回事 mac 归档实用工具 苹果电脑好用的压缩软件有哪些

Mac系统自带的 “归档实用工具”&#xff0c;集成在系统右键菜单中&#xff0c;包含了文件压缩和压缩包解压功能。很多mac小伙伴会发现有些文件使用归档实用工具打不开。由于专利和软件开源问题&#xff0c;该工具目前仅支持ZIP格式的压缩和解压。同时&#xff0c;对于一些在Wi…

Microsoft SQL Server 2019安装和设置用户密码

1、免费下载两个安装包 SQL2019-SSEI-Dev 地址:https://www.microsoft.com/en-us/sql-server/sql-server-downloads SSMS-Setup-CHS 地址:https://aka.ms/ssmsfullsetup 安装具体不在阐述了&#xff0c;可以参考我这篇文章&#xff1a;SQL Server 2019安装详细教程 2、以W…

Cookie的默认存储路径以及后端如何设置

问题场景 最近在写一个前后端分离的项目&#xff0c;需要跨域&#xff0c;前端开发同学遇到一个问题一直报错&#xff0c;本质上就是后端返回的cookie中的sessionID在前端发送http请求时无法被请求自动携带&#xff0c;每次htttpRequest都被后端识别为一个新的session&#xf…

昇思25天学习打卡营第04天 | 数据集 Dataset

昇思25天学习打卡营第04天 | 数据集 Dataset 文章目录 昇思25天学习打卡营第04天 | 数据集 Dataset数据集加载数据集迭代数据集的变换shufflemapbatch 自定义数据集可随机访问数据集对象可迭代数据集生成器 总结打卡 数据集Dataset对原始数据进行封装、变换&#xff0c;为神经网…

【Rust入门教程】hello world程序

文章目录 前言Hello World程序运行总结 前言 对于学习任何一种新的编程语言&#xff0c;我们都会从编写一个简单的Hello World程序开始。这是一个传统&#xff0c;也是一个开始。在这篇文章中&#xff0c;我们将一起学习如何在Rust中编写你的第一个程序&#xff1a;Hello Worl…

【C语言内存函数】

目录 1.memcpy 使用 模拟实现 2.memmove 使用 模拟实现 3.memset 使用 4.memcmp 使用 1.memcpy 使用 void * memcpy ( void * destination, const void * source, size_t num );目的地址 源地址 字节数 destination&#xff1a;指向要复制内…

20240703 每日AI必读资讯

&#x1f916;爆火Character AI惨遭阉割 美国00后集体“失恋” - Character AI曾是00后最火爆的社交软件&#xff0c;但用户发现对话模型变得冷淡&#xff0c;失去趣味。 - 用户流失严重&#xff0c;面临成本高、竞争激烈的挑战&#xff0c;甚至遭到挖角。 - 尽管困难重重&a…

最小步数模型——AcWing 1107. 魔板

最小步数模型 定义 最小步数模型通常是指在某种约束条件下&#xff0c;寻找从初始状态到目标状态所需的最少操作或移动次数的问题。这类问题广泛存在于算法、图论、动态规划、组合优化等领域。具体来说&#xff0c;它涉及确定一个序列或路径&#xff0c;使得按照特定规则执行…

jenkins在使用pipeline时,为何没有方块形视图

项目场景&#xff1a; 安装完Jenkins时后&#xff0c;通过pipeline创建的项目任务。 问题描述 在立即构建后&#xff0c;没有显示每个阶段的视图。 原因分析&#xff1a; 原因是&#xff0c;刚安装的Jenkins&#xff0c;这个视图不是Jenkins自带的功能&#xff0c;而必须安装…

EDA 虚拟机 Synopsys Sentaurus TCAD 2017.09 下载

下载地址&#xff08;制作不易&#xff0c;下载使用需付费&#xff0c;不能接受的请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1327I58gvV1usWSqSrG7KXw?pwdo03i 提取码&#xff1a;o03i

Boss直聘,无良厂商,乱封号

耽误招工作&#xff0c;瞎吉儿封号 哥们单身 需要女生多的公司 问一下都不行&#xff0c;什么尿性 直接就给你封了 装什么呢 辣鸡boss 倒闭吧赶紧 我是狗子&#xff0c;希望你倒闭&#xff01;

Radxa 学习摘录

文章目录 1、参考资料2、硬件知识CIF 和 ISP 3、shell4、交叉编译工具链5、问题6、DTS7、驱动 1、参考资料 技术论坛&#xff08;推荐&#xff09; 官方资料下载 wiki资料 u-boot 文档 u-boot 源码 内核文档 内核源码 原理图 radxa-repo radxa-build radxa-pkg radxa-doc…