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,一经查实,立即删除!

相关文章

0053__CancelIO的作用:防止为发送的数据丢失

CancelIO的作用&#xff1a;防止为发送的数据丢失-CSDN博客 cancelIoEx 函数 (ioapiset.h) - Win32 apps | Microsoft Learn

【Java】Logbook优化接口调用日志输出,优雅!

logbook 简介 很多人可能没有接触过 logbook&#xff0c;但它的确是一个很好用的日志框架。引用官网的介绍 Logbook 是一个可扩展的 Java 库&#xff0c;可以为不同的客户端和服务器端技术启用完整的请求和响应日志记录。它通过以下方式满足了特殊需求&#xff1a; 允许 Web 应…

计算机网络期末复习4(武夷学院版)

第四章 网络层 1、网际协议IP以及配套协议&#xff08;书P119&#xff09; 网际协议&#xff08;IP&#xff09;&#xff1a;IP协议是网络层的核心协议&#xff0c;负责数据包的编址和路由。它定义了数据包的格式和处理规则。 配套协议&#xff1a;地址解析协议ARP&#xf…

【工具】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;根据…

Vue 3中 <script setup> 与生命周期钩子函数的详细解析

Vue 3中 <script setup> 与生命周期钩子函数的详细解析 Vue 3 引入了 <script setup> 语法糖&#xff0c;这是一种简化和集成组件逻辑的新方式。尽管 <script setup> 简化了组件的编写&#xff0c;但仍然可以利用 Vue 提供的生命周期钩子函数来管理组件的生…

【光伏开发】光伏项目开发流程

光伏项目作为可再生能源领域的重要组成部分&#xff0c;其开发过程涉及多个环节&#xff0c;从项目初期的可行性研究到后期的运营维护&#xff0c;每一步都至关重要。本文将按照项目确认、前期阶段、中期阶段、后期阶段的顺序&#xff0c;详细介绍光伏项目的开发流程。 一、项…

Rust 基础教程

Rust 编程语言教程 Rust是一门注重安全、并发和性能的系统编程语言。本文将从Rust的基本语法、常用功能到高级特性&#xff0c;详细介绍Rust的使用方法。 目录 简介环境配置基础语法 变量和常量数据类型函数控制流 所有权和借用 所有权借用 结构体和枚举 结构体枚举 模块和包…

一文搞懂 java 线程池:基础知识

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 …

Linux:网络基础1

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

【云计算】阿里云、腾讯云、华为云平台数据库对比

目录 一、云数据库关键信息调研对比 二、详细功能 1、阿里云RDS 2、腾讯云RDS 3、华为云RDS 一、云数据库关键信息调研对比 云平台支持数据库部署对比支持功能备注阿里云 Mysql、Postgresql等 特有数据库&#xff1a;PolarDB&#xff0c;适配mysql 基础-单节点账号管…

实现渐变字体的方案

需要注意&#xff0c;这个切图是把一整块&#xff0c;都切出来做的。所以需要用span&#xff0c;不能是div 还有描边的话&#xff0c;scale会有边距缩放的问题&#xff0c;描边就用font weight 来实现 style{{ background: "var(--Linear, linear-gradient(96deg, #fff…

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

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

Python序列化和反序列化

一.序列化和反序列化 在Python中&#xff0c;序列化&#xff08;Serialization&#xff09;和反序列化&#xff08;Deserialization&#xff09;是处理对象数据的过程&#xff0c;主要用于对象的存储或网络传输。 序列化&#xff08;Serialization&#xff09; 序列化是将Pyth…

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…

深入探讨数据结构:基础理论与应用实践

前言 数据结构是计算机科学的重要组成部分&#xff0c;是编程与算法设计的基础。本文将系统地介绍数据结构的基础概念、常见类型、具体实现及其在实际开发中的应用&#xff0c;帮助读者深入理解这一核心领域。 一、数据结构的基本概念 数据结构指的是计算机中数据的组织、管…