[Golang]Goroutine基础
这篇文章将关注 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 关键字就可以提高程序执行速度。
关键词:
上一篇:电脑微信朋友圈在那里_电脑微信朋友圈在哪里打开-全球热点
下一篇:最后一页
- 广州科技活动周进入预热 明日正式启动300多场主题活动接踵而来
- 深化重点领域信用建设 广州正式出台新型监管机制实施方案
- 女童不慎掉入20米深井 18岁小姨三次下井成功营救
- 西安3个区域12月28日起每日开展全员核酸 官方提倡民众居家健身
- 浙江乐清一核酸检测结果异常人员 复采复检为阴性
- 浙江本轮疫情报告确诊病例490例 提倡“双节”非必要不出省
- 西安警方通报6起涉疫违法案件
- 西安新一轮核酸筛查日检测能力达160万管
- 西安市累计报告本土确诊病例811例
- 重庆曝光4起违反中央八项规定精神典型问题 警示党员干部清新过节
-
环球快消息!“七力”合成“邻聚力” 划出“精品生活圈”
铁西区“七力”合成“邻聚力”划出“精品生活圈”日常事有轮值楼长,矛盾事有“评理说事点”,家庭事有专业的“家长学校”……自打铁西区重工
-
新天然气(603393):2022年营业收入34.16亿元,与上期同比增加30.54%
新天然气(603393)(603393):2022年营业收入34 16亿元,与上期同比增加30 54%3月14日,新天然气2022年年报显示,本期营业
-
杭州市西湖区留下街道:乐享“家门口”的曲艺盛宴 世界要闻
杭州市西湖区留下街道:乐享“家门口”的曲艺盛宴
-
这班挺有闹第5季什么时候播出_这班挺有闹第5季|环球消息
1、这班挺有闹第五季预告 共12集主演:王博文邢原源高禹恒孙伏雨陈小龙子欣导演:阎凯地区:大陆播出时间:2021 06
-
全球热讯:海外资产创新高!俄罗斯去年建立800亿美元海外现金储备
智通财经APP获悉,俄罗斯去年从大宗商品出口中获得了2270亿美元的意外之财,其中约三分之一储蓄在海外。在美国及其盟友考虑加强对俄罗斯的制裁
-
钉螺的做法大全家常菜_钉螺的做法大全|世界最资讯
1、1 准备材料2 下油葱姜蒜爆香3 放入钉螺翻炒4 加入料酒翻炒均匀,到入清水没过钉螺,加盖煮5分钟5 开锅,放入盐味
-
两家沙特航司接近同波音达成协议,有望采购近80架787梦想飞机|当前快播
两家沙特航司接近同波音达成协议,有望采购近80架787梦想飞机,梦想,航空,沙特航司,军工企业,喷气式飞机,波音787
-
建筑工程施工合同备案有时间限制吗-世界新消息
一、建筑工程施工合同备案有时间限制吗建筑工程施工合同备案有时间限制。《房屋建筑和市政基础设施工程施工招投标管理办法》第四
-
全球聚焦:恒生银行(ADR)(HSNGY.US)3月13日收盘报14.91美元/股,跌1%
截至2023年3月13日(美国东部时间)收盘,恒生银行(ADR)(HSNGY US)报收于14 91美元 股,下跌1 0%,成交量7 29万股。
-
中原建业预期2022年净利最多下跌65% 因在管项目建设周期延长等
中原建业预期2022年净利最多下跌65%因在管项目建设周期延长等
X 关闭
[Golang]Goroutine基础
电脑微信朋友圈在那里_电脑微信朋友圈在哪里打开-全球热点
电脑怎么滚动截长屏
全球热点!香精勾兑假“泰国香米”4家企业被曝光 安徽寿县政府已展开调查
水锤效应_水锤
X 关闭
焦点讯息:水发燃气董秘回复:根据《上海证券交易所股票上市规则》的规定
西安警方完成研考安保工作 共出动警力逾1.3万人次
得知西安疫情防控“升级” 男子夜骑共享单车回咸阳淳化
中国医生将任SIU主席背后:从追随者同行者到引领者
海南省通报政法队伍教育整顿成果