当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2023-11-13 17:17:56 186观看
导读并发是Go编程语言的基本特性,意味着程序可以同时执行多个任务。Golang的并发独特而强大,其内置的轻量级协程(goroutine)和通道(channel)支持创建可伸缩、安全、高性能的高并发系统。本文将探索Go中和并发性有关的七个有

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

NqQ28资讯网——每日最新资讯28at.com

本文将探索Go中和并发性有关的七个有趣事实,并提供示例。NqQ28资讯网——每日最新资讯28at.com

1. 协程(Goroutines)

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

下面是一个创建goroutine的例子:NqQ28资讯网——每日最新资讯28at.com

NqQ28资讯网——每日最新资讯28at.com

在本例中,定义了printMessage函数,该函数接受一个消息字符串以及打印消息的次数,其中sleep语句用来模拟在每次消息打印之间完成的一些额外工作。NqQ28资讯网——每日最新资讯28at.com

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

2. 通道(Channels)

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

下面是一个使用channel的例子:NqQ28资讯网——每日最新资讯28at.com

NqQ28资讯网——每日最新资讯28at.com

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

3. 缓冲通道(Buffered Channels)

缓冲通道是在读取之前可以保存一定数量的值的通道,对于管理并发系统中的突发流量非常有用。使用make函数可以创建缓冲通道,通过第二个参数指定缓冲区大小。NqQ28资讯网——每日最新资讯28at.com

下面是一个使用缓冲通道的例子:NqQ28资讯网——每日最新资讯28at.com

NqQ28资讯网——每日最新资讯28at.com

在本例中,我们创建了一个缓冲区大小为2的int类型的缓冲通道。然后使用<-操作符向通道发送两个值(1和2)。最后,我们使用<-操作符从通道接收值,并打印到控制台。NqQ28资讯网——每日最新资讯28at.com

4. Select语句

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

下面是一个使用select语句的例子:NqQ28资讯网——每日最新资讯28at.com

NqQ28资讯网——每日最新资讯28at.com

本例中创建了两个通道(ch1和ch2)和两个向这些通道发送消息的goroutine。然后,我们使用select语句等待消息到达ch1或ch2。当消息到达时,将其打印到控制台。NqQ28资讯网——每日最新资讯28at.com

5. Mutex

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

下面是一个使用互斥锁的例子:NqQ28资讯网——每日最新资讯28at.com

NqQ28资讯网——每日最新资讯28at.com

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

6. WaitGroup

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

下面是一个使用WaitGroup的例子:NqQ28资讯网——每日最新资讯28at.com

NqQ28资讯网——每日最新资讯28at.com

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

7. Context

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

下面是一个使用context的例子:NqQ28资讯网——每日最新资讯28at.com

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.Context和sync.WaitGroup作为参数的worker函数。worker函数用select语句等待来自context的cancel信号或者在default中执行某些工作。我们还定义了一个main函数,该函数用context.WithCancel创建上下文,并启动worker goroutine。等待5秒后cancel context,它会向worker goroutine发送cancel信号,让它停止工作。在打印最终消息之前,我们用WaitGroup来等待worker goroutine结束。NqQ28资讯网——每日最新资讯28at.com

结论

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

本文链接:http://www.28at.com/showinfo-26-23612-0.htmlGolang不可不知的七个并发概念

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: DDD领域驱动设计:为什么公司需要这种方法,谁使用它,它的本质是什么?

下一篇: 一起学Elasticsearch系列-Query DSL

标签:
  • 热门焦点
  • K60至尊版刚预热 一加Ace2 Pro正面硬刚

    K60至尊版刚预热 一加Ace2 Pro正面硬刚

    Redmi这边刚如火如荼的宣传了K60 Ultra的各种技术和硬件配置,作为竞品的一加也坐不住了。一加中国区总裁李杰发布了两条微博,表示在自家的一加Ace2上早就已经采用了和PixelWo
  • JavaScript 混淆及反混淆代码工具

    JavaScript 混淆及反混淆代码工具

    介绍在我们开始学习反混淆之前,我们首先要了解一下代码混淆。如果不了解代码是如何混淆的,我们可能无法成功对代码进行反混淆,尤其是使用自定义混淆器对其进行混淆时。什么是混
  • K8S | Service服务发现

    K8S | Service服务发现

    一、背景在微服务架构中,这里以开发环境「Dev」为基础来描述,在K8S集群中通常会开放:路由网关、注册中心、配置中心等相关服务,可以被集群外部访问;图片对于测试「Tes」环境或者
  • “又被陈思诚骗了”

    “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 猿辅导与新东方的两种“归途”

    猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 新电商三兄弟,“抖快红”成团!

    新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    OPPO K11采用全方位护眼屏:三大护眼能力减轻视觉疲劳

    日前OPPO官方宣布,全新的OPPO K11将于7月25日正式发布,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼IMX890主摄,堪称是2000档位影像表
  • OPPO K11样张首曝:千元机影像“卷”得真不错!

    OPPO K11样张首曝:千元机影像“卷”得真不错!

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    荣耀Magic4 至臻版 首创智慧隐私通话 强劲影音系统

    2022年第一季度临近尾声,在该季度内,许多品牌陆续发布自己的最新产品,让大家从全新的角度来了解当今的手机技术。手机是电子设备中,更新迭代十分迅速的一款产品,基
Top