Golang不可不知的7个并发概念

并发性支持是Golang最重要的原生特性之一,本文介绍了Golang中和并发性相关的7个概念。原文: Golang: 7 must-know concurrency related concepts

并发是Go编程语言的基本特性,意味着程序可以同时执行多个任务。Golang的并发独特而强大,其内置的轻量级协程(goroutine)和通道(channel)支持创建可伸缩、安全、高性能的高并发系统。

alt

本文将探索Go中和并发性有关的七个有趣事实,并提供示例。

1. 协程(Goroutines)

Goroutine是Go编程语言的特性之一,这是轻量级线程,与同一地址空间中的其他goroutine并发运行。它的创建成本非常低,Go运行时可以同时处理数千个goroutine。Goroutine使编写高并发程序变得容易,这些程序可以根据需要伸缩。

下面是一个创建goroutine的例子:

alt

在本例中,定义了printMessage函数,该函数接受一个消息字符串以及打印消息的次数,其中sleep语句用来模拟在每次消息打印之间完成的一些额外工作。

main函数中,调用go printMessage("Hello", 5)go printMessage("world", 5)来启动两个goroutine。这创建了两个与主线程并发运行的独立执行线程。time.Sleep(1 * time.Second)语句用于将主线程暂停一秒钟,这给了两个goroutine足够的时间来执行和打印消息。

2. 通道(Channels)

Channel是Go的另一个基本特性,支持在程序之间进行通信和同步。Channel是一种有类型管道,可以使用<-操作符发送和接收。Channel确保了并发进程之间安全有效的通信。

下面是一个使用channel的例子:

alt

在本例中,make函数创建了一个string类型的channel。然后,我们创建一个使用<-操作符向channel发送消息"Hello from channel!"的goroutine。最后,我们使用<-操作符从channel接收消息并将其打印到控制台。

3. 缓冲通道(Buffered Channels)

缓冲通道是在读取之前可以保存一定数量的值的通道,对于管理并发系统中的突发流量非常有用。使用make函数可以创建缓冲通道,通过第二个参数指定缓冲区大小。

下面是一个使用缓冲通道的例子:

alt

在本例中,我们创建了一个缓冲区大小为2的int类型的缓冲通道。然后使用<-操作符向通道发送两个值(12)。最后,我们使用<-操作符从通道接收值,并打印到控制台。

4. Select语句

Go中的select语句允许我们同时等待多个通道操作。这是个强大的结构,可以帮助我们编排复杂的并发系统。select语句会阻塞直到其中一个case可以继续进行,此时就执行该case。

下面是一个使用select语句的例子:

alt

本例中创建了两个通道(ch1ch2)和两个向这些通道发送消息的goroutine。然后,我们使用select语句等待消息到达ch1ch2。当消息到达时,将其打印到控制台。

5. Mutex

Go中的互斥锁(sync.Mutex)提供了一种简单有效的方法来保护共享资源免受并发访问。mutex是一种互斥锁,一次只允许一个程序访问资源,任何其他试图在资源被锁定时访问该资源的goroutine都将被阻塞,直到锁被释放。

下面是一个使用互斥锁的例子:

alt

在这个例子中,我们定义了一个Counter类型,包含count字段和一个sync.Mutex。在Counter类型上定义了两个方法: Increment()Count()。这两种方法都使用互斥锁来确保一次只有一个goroutine可以访问count字段。最后,我们创建1000个增加count字段的goroutine,在打印最终计数之前等待它们全部完成。

6. WaitGroup

Go中的sync.WaitGroup类型提供了一种同步多个goroutine的简单方法。WaitGroup在继续之前等待一组goroutine完成,是协调多个goroutine执行的有力工具,可以帮助我们确保在进入程序的下一步之前,所有goroutine都已完成。

下面是一个使用WaitGroup的例子:

alt

在本例中,我们创建了一个WaitGroup和10个goroutine。每个goroutine休眠数秒,然后向控制台打印一条消息。我们使用WaitGroup来确保在打印最终消息之前所有的goroutine都已经完成。

7. Context

Go中的context包提供了一种跨API边界和进程之间携带截止日期、取消信号和其他请求作用域值的方法,是在并发系统中管理资源的强大工具,可以帮助我们避免常见问题(如goroutine泄漏)。

下面是一个使用context的例子:

func worker(ctx Context.context, wg *sync.WaitGroup) {
  defer wg.Done()
  for {
    select {
    case <- ctx.Done():
      fmt.Println("Worker received cancel signal")
      return
    default:
      fmt.Println("Worker is working...")
      time.Sleep(1 * time.Second)
    }
  }
}

func main() {
  ctx, cancel := context.WithCancel()
  var wg sync.WaitGroup
  wg.Add(1)
  go worker(ctx, &wg)
  time.Sleep(5 * time.Second)
  cancel()
  wg.Wait()
  fmt.Println("All workers stopped")
}

在这个例子中,我们定义了一个接受context.Contextsync.WaitGroup作为参数的worker函数。worker函数用select语句等待来自context的cancel信号或者在default中执行某些工作。我们还定义了一个main函数,该函数用context.WithCancel创建上下文,并启动worker goroutine。等待5秒后cancel context,它会向worker goroutine发送cancel信号,让它停止工作。在打印最终消息之前,我们用WaitGroup来等待worker goroutine结束。

结论

总的来说,并发性是Go中的一个重要主题,并且该语言为处理并发系统提供了一组强大的工具。无论是构建web服务器、分布式系统还是简单的命令行工具,了解Go的并发性对于构建健壮、可扩展、高效的程序都必不可少。


你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。为了方便大家以后能第一时间看到文章,请朋友们关注公众号"DeepNoMind",并设个星标吧,如果能一键三连(转发、点赞、在看),则能给我带来更多的支持和动力,激励我持续写下去,和大家共同成长进步!

- END -

本文由 mdnice 多平台发布

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

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

相关文章

【Linux操作系统】探秘Linux奥秘:文件系统的管理与使用

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS &…

【数据结构】栈和队列(队列的基本操作和基础知识)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​ 目录 前言 队列 队列的概念和结构 队列的…

二叉树详解(深度优先遍历、前序,中序,后序、广度优先遍历、二叉树所有节点的个数、叶节点的个数)

目录 一、树概念及结构(了解) 1.1树的概念 1.2树的表示 二、二叉树概念及结构 2.1概念 2.2现实中的二叉树&#xff1a; 2.3数据结构中的二叉树&#xff1a; 2.4特殊的二叉树&#xff1a; 2.5 二叉树的存储结构 2.51 顺序存储&#xff1a; 2.5.2 链式存储&…

CSS2_基础学习

CSS2_基础学习 一、css基础知识二、css选择器2.0 选择器的优先级2.1 CSS基本选择器2.2 复合选择器2.2.1. 交集选择器2.2.2. 并集选择器2.2.3. 后代选择器&#xff08;加空格&#xff09;2.2.4. 子代选择器2.2.5. 兄弟选择器2.2.6. 属性选择器2.2.7. 伪类选择器2.2.8. 伪元素选择…

微信小程序发送模板消息-详解【有图】

前言 在发送模板消息之前我们要首先搞清楚微信小程序的逻辑是什么&#xff0c;这只是前端的一个demo实现&#xff0c;建议大家在后端处理&#xff0c;前端具体实现&#xff1a;如下图 1.获取小程序Id和密钥 我们注册完微信小程序后&#xff0c;可以在开发设置中看到以下内容&a…

navicat premium历史版本下载及更新navicat premium15 永久(使用)有效期

1、navicat premium介绍 Navicat Premium 是一套可创建多个连接的数据库开发工具&#xff0c;让你从单一应用程序中同时连接 MySQL、Redis、MariaDB、MongoDB、SQL Server、Oracle、PostgreSQL 和 SQLite 。它与 GaussDB 、OceanBase 数据库及 Amazon RDS、Amazon Aurora、Amaz…

基于简化版python+VGG+MiniGoogLeNet的智能43类交通标志识别—深度学习算法应用(含全部python工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Anaconda环境 模块实现1. 数据预处理 相关其它博客工程源代码下载其它资料下载 前言 本项目专注于解决出国自驾游特定场景下的交通标志识别问题。借助Kaggle上的丰富交通标志数据集&#xff0c;我们采用了VGG和G…

推荐系统中 排序策略 CTR 动态加权平均法

CTR&#xff08;Click-Through Rate&#xff09;动态加权平均法是一种用于计算广告点击率的方法&#xff0c;其中每个点击率被赋予一个权重&#xff0c;这个权重可以随着时间、事件或其他因素而动态调整。这种方法旨在更灵活地反映广告点击率的变化&#xff0c;使得最近的数据更…

Mybatis 事务接口

当我们从数据源中得到一个可用的数据库连接之后&#xff0c;就可以开启一个数据库事务了&#xff0c;事务成功开启之后&#xff0c;我们才能修改数据库中的数据。 在修改完成之后&#xff0c;我们需要提交事务&#xff0c;完成整个事务内的全部修改操作&#xff0c;如果修改过…

JAVA:利用JUnit进行高效的单元测试

1、简述 在软件开发中&#xff0c;单元测试是确保代码质量和可维护性的关键步骤。JUnit作为Java领域最流行的单元测试框架之一&#xff0c;提供了简单而强大的测试工具&#xff0c;可以帮助开发者在项目开发过程中及时发现和修复代码中的问题。本文将介绍JUnit的基本用法以及一…

【每日一题】一周中的第几天

文章目录 Tag题目来源解题思路方法一&#xff1a;模拟 写在最后 Tag 【模拟】【数学】【2023-12-30】 题目来源 1185. 一周中的第几天 解题思路 方法一&#xff1a;模拟 思路 题目中的日期是在 1971 到 2100 年之间的有效日期&#xff0c;即 1971-01-01 到 2100-12-31 范围…

【c语言】飞机大战2

1.优化边界问题 之前视频中当使用drawAlpha函数时&#xff0c;是为了去除飞机后面变透明&#xff0c;当时当飞机到达边界的时候&#xff0c;会出现异常退出&#xff0c;这是因为drawAlpha函数不稳定&#xff0c;昨天试过制作掩码图&#xff0c;下载了一个ps,改的话&#xff0c…

易舟云财务软件使用教程【文章目录】

易舟云财务软件使用教程【文章目录】 1、财务软件导论2、易舟云财务软件3、财务软件原理4、账套5、会计凭证6、资金日记账7、发票8、员工工资9、固定资产10、期末处理(结转与结账)11、会计账簿12、财务报表13、财务软件设置 1、财务软件导论 财务软件导论 2、易舟云财务软件 …

Java循环高级(无限循环,break,continue,Random,逢七过,平方根,判断是否是质数,猜数字小游戏)

文章目录 1.无限循环概念&#xff1a;for格式&#xff1a;while格式&#xff1a;do...while格式&#xff1a;无限循环的注意事项&#xff1a; 2.条件控制语句break:continue: 3. Random使用步骤&#xff1a; 4. 逢七过5. 平方根6.判断是否为质数7. 猜数字小游戏 1.无限循环 概…

初识SpringBoot(2023最后一篇文章)

初识SpringBoot 1、SpringBoot概述 Spring是什么&#xff1f; Spring是一个于2003 年兴起的一个轻量级开源Java开发框架&#xff0c;由Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》。Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;使…

Linux系统安装DockerDocker-Compose

1、Docker安装 下载Docker依赖的组件 yum -y install yum-utils device-mapper-persistent-data lvm2 设置下载Docker服务的镜像源&#xff0c;设置为阿里云 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 安装Docker服务 …

【中南林业科技大学】计算机组成原理复习包括题目讲解(超详细)

来都来了点个赞收藏关注一下再走呗&#x1f339;&#x1f339;&#x1f339;&#x1f339; 第1章&#xff1a;绪论 1.冯诺依曼机特点&#xff0c;与现代计算机的区别 冯诺依曼计算机的基本思想是&#xff1a;程序和数据以二进制形式表示&#xff0c;存储程序控制。在计算机中&…

2024年【高压电工】找解析及高压电工考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 高压电工找解析根据新高压电工考试大纲要求&#xff0c;安全生产模拟考试一点通将高压电工模拟考试试题进行汇编&#xff0c;组成一套高压电工全真模拟考试试题&#xff0c;学员可通过高压电工考试技巧全真模拟&#…

如何使用Docker compose安装Spug并实现远程访问登录界面

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、Cpolar杂谈 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. Docker安装Spug二. 本地访问测试三. Linux 安装cpolar四. 配置Spug公网访问…

电脑报错“kernelbase.dll”文件缺失,软件游戏无法启动的解决方法

很多小伙伴留言说&#xff0c;每次自己要游戏或软件的时候&#xff0c;电脑就会弹出报错框&#xff0c;不知道应该怎么办&#xff1f; 其实&#xff0c;Windows报错提示已经说明了&#xff0c;程序找不到名为“kernelbase.dll”的文件&#xff0c;需要重新安装修复这个问题。 …