首页>动态>正文
[Golang]Goroutine基础
2023-03-14 12:14:12    来源:腾讯云

这篇文章将关注 Go 语言基础部分。我们将讨论关于性能方面的一些知识,并通过创建一些简单的 goroutine 来扩展我们的应用程序。

我们还会关注一些 Go 语言的底层执行逻辑以及 Go 语言与其他语言的不同之处。


(资料图片仅供参考)

Go 语言的并发

继续讨论之前,我们必须理解并发与并行的概念。Golang 可以实现并发和并行。

我们一起来看下并发与并行的区别。

理解并发

应用程序可能会通过处理多个进程来完成预期的功能。我们来假设一个简单的电子商务网站,经评估有下列需要并发执行的任务:

在网页的顶部显示最新的交易和产品信息;显示网站当前的在线用户数量;当用户选择商品之后更新购物车详情;为“目标交易额”倒计时;

该网站需要同时运行所有这些任务,以使用户与网站保持关联,并使网站对用户有吸引力并吸引更多业务。

因此,为了满足业务需要,一个简单的应用程序或者网站都可能包含一组后台运行的任务。

上图所示的两个示例中,有多个任务同时执行,但是它们之间仍然有区别。让我们进一步研究以便能更了解。

理解并发与并行执行

处理并发应用

假设这样一种场景,我们有一台单核机器,需要完成多个任务,但有个限制,在任何时刻,单核机器上只能运行一个任务。

在并发模型中,任务之间存在上下文切换。该程序正在处理多个任务,但由于我们只有单核,因此任务无法一起执行。

任务之间的上下文切换很快,以至于我们感觉任务是同时运行的。

在执行过程中没有并行执行的因素,因为是一个单核系统,多进程不能并行执行。

如上图所示,Concurrency (Without Parallelism) 有两个任务需要并发执行。在任何时候,只有一个任务在运行并且任务之间存在上下文切换。

应用程序加入并行

使用单核的情况下,存在核数限制。如果我们给机器增加核数,就可以在不同的内核上同时执行任务。

在上图中(Parallelism),任一时刻都有两个任务在执行,这两个任务运行在不同的内核上。

并发是某一时间段内同时处理多个任务,并行是在某一时间点能执行多个任务。

使用 Go 语言可以轻松地将程序从并发扩展为并行执行。

使用协程

使用 Go 语言实现并发和并行,我们需要了解协程(Goroutines)的概念。Go 语言的协程可以理解为线程之上的一个包装器,由 Go 运行时管理而不是操作系统。

Go 运行时负责给协程分配和回收资源,协程与完成多任务的线程非常相似但又比操作系统线程消耗更少的资源。协程与线程之间并非一对一的关系。

我们可以将应用程序“拆解”成多个并发任务,这些任务可以由不同的 goroutine 完成,通过这种方式即可实现了 Go 语言并发。

协程的优点:

更轻量级;易扩展;虚拟线程;需要更少的初始内存(2KB);有必要的话,Go 运行时能分配更多的内存;

一起来看下一个简单的例子:

packagemainimport("fmt""time")funcmain(){start:=time.Now()func(){fori:=0;i<3;i++{fmt.Println(i)}}()func(){fori:=0;i<3;i++{fmt.Println(i)}}()elapsedTime:=time.Since(start)fmt.Println("TotalTimeForExecution:"+elapsedTime.String())time.Sleep(time.Second)}

上面的代码按顺序依次在 main 函数里面执行了两个独立函数。

代码没有使用协程,程序在同一个线程中执行完成。程序没有任何的并发性,执行结果如下:

代码按顺序执行,从主函数开始,先执行第一个函数,再执行第二个函数,最后从主函数正常退出。

引入协程

上面的场景例子中没有使用任何的协程。我们可以在执行函数之前使用 go 关键字开启协程。

依旧是上面的例子,我们一起来看看使用 go 关键字开启协程之后会是什么样的:

packagemainimport("fmt""time")funcmain(){start:=time.Now()gofunc(){fori:=0;i<3;i++{fmt.Println(i)}}()gofunc(){fori:=0;i<3;i++{fmt.Println(i)}}()elapsedTime:=time.Since(start)fmt.Println("TotalTimeForExecution:"+elapsedTime.String())time.Sleep(time.Second)}

执行上面的代码输出:

上面的代码,使用 go 关键字分别开启了两个协程并执行各自的函数,包括主协程,总共有 3 个协程。

理解与顺序执行的不同

上面的代码,我们使用 go 关键字开启协程,函数会在协程中完成执行,而不是在主协程中执行,这样增加了并发并提高了程序性能。

增加并行性

Go 语言里,可以通过下面这行简单的代码设置程序运行的内核数目(PS:从 Go 1.5开始,Go 的 GOMAXPROCS 默认值已经设置为 CPU 的核数)。

runtime.GOMAXPROCS(4)

这可以指定程序在多核机器上运行,上面一行代码指定程序可以使用四个内核来执行。

一旦创建了协程,便可以在不同的内核中执行,从而实现并行并加快程序执行速度。

packagemainimport("fmt""time""runtime")funcmain(){runtime.GOMAXPROCS(4)start:=time.Now()gofunc(){fori:=0;i<3;i++{fmt.Println(i)}}()gofunc(){fori:=0;i<3;i++{fmt.Println(i)}}()elapsedTime:=time.Since(start)fmt.Println("TotalTimeForExecution:"+elapsedTime.String())time.Sleep(time.Second)}

上面的代码输出如下:

使用 Go 语言可以轻松实现并发和并行。只需在函数之前添加 go 关键字就可以提高程序执行速度。

关键词:

[Golang]Goroutine基础

这篇文章将关注Go语言基础部分。我们将讨论关于性能方面的一些知识,并通过创建一些简单的goroutine来扩展我们的应用程序。2023-03-14

订单破5000!锐界L演绎大7座SUV高价值标准_快看点

自正式亮相开启小订以来,锐界(参数|询价)L截止目前订单量已突破5000台!凭借跃级尺寸、2+2+3座椅布局及魔变舒享空2023-03-14

纸媒婆的回忆_环球新视野

作者文笔一般,可能存在ooc,本文纯属虚构我是纸媒婆,对,就是你想的那个,被聂莫黎一口吞了的那个都说人死了之后会有走马灯,没想到身为纸人2023-03-14

山东长宇镀铝材料有限公司

1、山东长宇镀铝材料有限公司于2010年08月19日在东平县工商行政管理局登记成立。2、法定代表人徐相峰,公司经营范2023-03-14

山东银灯企业管理有限公司

1、山东银灯企业管理有限公司于2018年09月27日成立。2、法定代表人张修明,公司经营范围包括:企业管理咨询;企业2023-03-13

北京“京彩·绿色”消费券3月11日起在京东发放 至高可享1600元优惠|今日热讯

为加快释放绿色节能消费潜力,促进消费升级,进一步满足多样化消费需求,北京市于3月11日至31日,每天上午10:00起,面向在京消费者,发放“京2023-03-13

我有多爱你你有多爱我其实我们都说不出来是什么歌_全球速看料

我有多爱你你有多爱我其实我们都说不出来是歌曲《最后的人》的歌词。《最后的人》是由杨小壮作词、作曲,杨小壮演唱的歌曲,歌曲2023-03-13

世界速递!中储股份3月13日盘中涨幅达5%

以下是中储股份在北京时间3月13日14:32分盘口异动快照:3月13日,中储股份盘中涨幅达5%,截至14点32分,报5 62元,成交1 98亿元,换手率1 66%2023-03-13

4款围巾搭配法,简单百搭还洋气,打造御寒又增加时髦感|全球讯息

人靠衣装,佛靠金装。穿衣搭配也是一门学问,学会穿搭不仅能够提高你的审美,还能提升自身气质。春季,除了有很多好看的外套可以穿之外,还有2023-03-13

当前最新:原神神樱大祓镇守之森任务怎么做_原神神樱大祓镇守之森怎么触发

1、小樱樱怎么做守护森的任务?让我们看一看。2、首先要传输到守林的传输点,沿路走;3、在鸟居的第6到第7个地方,会有土墩2023-03-13

快资讯丨《血色浪漫》18年后7大“顽主”现状,有人离世,有人抛妻弃女

2004年由作家都梁小说改编的电视剧《血色浪漫》搬上了银幕,此剧一经开播深受观众的喜爱。老一辈人从剧中“顽主”的身上看到了自己青春时的影2023-03-13

要闻速递:小儿宣肺颗粒的功效_小儿宣肺止咳颗粒是什么药

1、小儿宣肺止咳颗粒是治疗小儿上呼吸道感染、支气管炎或痰热壅肺,如咯痰不爽、痰稠黄、咽干、舌红苔黄等症的药物。2、具有宣2023-03-13

植物和矿质营养|世界快讯

1、《植物和矿质营养》是1986年科学出版社出版的图书。2、作者是萨克利夫、贝克。2023-03-12

独家|国元证券前董事长蔡咏被带走调查朋友圈已1个月未更新

独家|国元证券前董事长蔡咏被带走调查朋友圈已1个月未更新:财联社记者从多个消息源求证获悉,国元证券前董事长蔡咏被带走调查,更多细节还待2023-03-12

【直击引领区】已完成首例患者的回输治疗!浦东创新药CAR-T产品“再战”新适应症_全球看热讯

近日,位于浦东张江的药明巨诺公司,宣布其已启动倍诺达®(瑞基奥仑赛注射液)用于一线治疗高风险大B细胞淋巴瘤的临床研究,并已完成首例患者2023-03-12

安徽省体育局机关服务中心志愿服务队

1、安徽省体育局机关服务中心志愿服务队是由安徽省体育局领导下的志愿团体。2、成立于2018年11月6日。本文到此分享2023-03-12

白鲢鱼和花鲢鱼哪个好吃_白鲢鱼

1、结局之火影忍者第七代 我爱火影“今天我在此就任木叶忍村第七代火影!”木叶丸雄浑的声音响彻村子的每个角落2023-03-12

环球快讯:苹果12护眼模式在哪里

苹果12护眼模式在哪里?1 在手机设置中点击【显示和亮度】。2 单击[夜景]。3 打开[设定时间]并选择设定时间。本文到2023-03-11

快报:03月11日从德宏出发到黄南的防疫政策

03月11日从德宏出发到黄南的防疫政策(数据来源:本地宝)1、出德宏-:正常通行2、到黄南-:【最新消息】2月7日国家卫2023-03-11

超过4g的文件怎么传输到u盘_超过4g的文件怎么传输-环球聚焦

1、要传输超过,只需压缩文件夹。2、广义的“文件”是指有关政策和理论的官方文件和信函或文章。文件的种类非常广泛。电脑上运2023-03-11

【天天播资讯】神仙对局让青帝都感到压力,七国服齐聚一堂,宛如巅峰对决

最近青帝在沉浸了几天之后,也是重新回归到直播行列之中,然而才回归到直播,青帝就遇上了一局非常艰难的对决。这局自家有着三个国服选手,而2023-03-11

全国两会:不出意外,这五个提案肯定不会被采纳!_资讯

全国两会:不出意外,这五个提案肯定不会被采纳!,个税,提案,英语,养老金,全国两会,平均工资2023-03-11

今亮点!千年祝祭

1、《史诗版》:当你睁开眼睛,看到的不再是熟悉的天空,当你迈开脚步。2、所踏也不是曾经的大地……你真能对一切泰然不惊,处2023-03-11

坦途是什么档次_坦途是什么意思

1、坦途说得是平坦的道路。2、荆棘意思是前进的道路上充满了重重的困难险阻。本文到此分享完毕,希望对大家有所帮助。2023-03-11

荣耀50最严重缺点是什么|天天讯息

手机荣耀50是一款可以首次搭载骁龙778G的HONOR。这款手机为用户提供了全新的手机外形设计,可以为用户提供超高的手机2023-03-11