这篇文章将关注 Go 语言基础部分。我们将讨论关于性能方面的一些知识,并通过创建一些简单的 goroutine 来扩展我们的应用程序。
(资料图)
我们还会关注一些 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 关键字就可以提高程序执行速度。
这篇文章将关注Go语言基础部分。我们将讨论关于性能方面的一些知识,并通过创建一些简单的goroutine来扩...
3月14日石墨烯板块较上一交易日下跌0 96%,中科电气领跌。当日上证指数报收于3245 31,下跌0 72%。深...
哈伊杜克U19对阵多特蒙德U19的欧青联1 4决赛将于当地时间周三在多特蒙德的西格纳伊杜纳球场打响,哈伊...
1、答:在08年北京奥运会女排中国女排获得第三名,第一名是战胜了美国女排首次获得世界冠军的巴西女排。2...
1、从“山光悦鸟性”拟人化的手法中可以看出诗人对自然风光的喜好,隐归山林的惬意之情。2、诗人一生沉...
03月14日,深桑达A股价大涨。截至今日收盘,深桑达A上涨6 43%,收盘价为34 92元,收盘价创历史新高。...
1、芳华女主角苗苗今年二十二岁。2、关于冯女郎苗苗的年龄,网络上有两个说法,一种是1993年出生,今年2...
苹果扩充奥地利等6个中欧国家AppleMaps地图,波兰,奥地利,匈牙利,maps,苹果公司,财务报表,财务会计,apple
这一次给大家带来黎明觉醒生机的黎明觉醒皮卡车获得攻略解决方法。其实很多人都不知道应该如何解决,那...
1、广西广松智能科技有限公司于2019年05月15日成立。2、法定代表人李振广,公司经营范围包括:电焊机、...
其中,关于柔性定制服装印花机设备的关键词“DTFPrinter”在海外搜索量同比增长186%
最新!湖北公开招聘11653名中小学教师
B站不爱说教,因为年轻人最懂年轻人。《中国奇谭》爆火、小破站跨晚整活儿,刚刚开年不久,B站再度“破...
截至2023年3月13日收盘,一彬科技(001278)报收于30 58元,上涨3 24%,换手率69 88%,成交量21 62万手,成交额6 47亿元。
国泰中证全指通信设备ETF(515880)3月13日盘中涨2 01%,最新单位净值为0 9650。该基金最近一周跌1 8...
《投资者网》吴微自2020年中国茶叶股份有限公司(下称“中国茶叶”)、八马茶业股份有限公司(下称“八...
同花顺(300033)金融研究中心3月13日讯,有投资者向福斯达(603173)提问,公司作为工业特种气体提取、...
1、杭州链家房地产经纪有限公司于2016年05月31日在杭州市江干区市场监督管理局登记成立。2、法定代表人...
当地时间3月12日,石油巨头沙特阿美公司公布了2022年的年度利润,达到1611亿美元,创下历史新高。据“德...
第五人格自从圣心医院这张图开始,一个全新的概念被引入——高低差。医院内通过楼梯上到二楼的设定,让...
全国政协委员曹晖建议:加强青少年创新实践教育近年来,在党和国家的政策指导下,全社会对青少年的课业...
自3月12日20:00起,援鄂医疗队员及省内医护人员可通过武汉大学官方网站、官方微信进入武汉大学赏樱预约...
今日NBA常规赛,勇士将在主场迎战雄鹿。据统计,在过去的7场比赛中,勇士在比赛首节已经遭遇7连败。过去...
1、你可以先找些建筑制图的书籍看啊因为我就是建筑专业的这上面的窍门需要在你有一定认识的基础上自己去...
1、盐酸索他洛尔片,适应症为1.转复,预防室上性心动过速,特别是房室结折返性心动过速,也可用于予激...
X 关闭
X 关闭