这篇文章将关注 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基础
- 热点聚焦:严正公告
- 环球今头条!小鲫鱼怎么做好吃简单方法_
- 天天精选!逗比人生阿尔法狗攻略_逗比人
- 精选!梅西竟成反向斯特林:右脚抡空左脚
- 热点在线丨荣耀盒子怎么下载当贝市场
- 焦点讯息:犯罪过失损坏交通设施需要负什
- 视点!新车报讯:现代伊兰特N最新预告图
- 当前讯息:九章算术的作者祖冲之_九章算
- 当前资讯!北川美幸
- 环球今头条!文旅“内卷”?福建的副市长
- 热点!怎样修改照片大小为200k_怎样修改
- 全球热点评!安眠药哪种效果好 知乎_安
- 全球热资讯!连帽卫衣里面穿什么好_卫衣
- 【全球快播报】沈阳地铁二号线线路图图片
- 动态焦点:儿童血红蛋白正常值范围_高铁血
- 今日关注:妇女节表彰大会上,为什么领奖
- 每日热闻!红枣银耳羹的做法视频_红枣银耳
- 世界快资讯:好儿不争娘田地好女不争嫁时
- 当前时讯:今天最新消息 城乡双向经济循
- 当前要闻:阳了应该怎么办-阳性感染者如
- 当前看点!枸骨是否有抗癌的功效_枸骨是什
- 环球要闻:输掉榜首大战!C罗差点又扔队
- 【报资讯】客观的意思有哪些_客观的意思
- 【世界热闻】qq群发怎么发所有人
- 快看点丨梦色糕点师安利_梦色糕点师之希逸
- 世界最资讯丨新媒:中美经贸关系“分手很
- 焦点速递!3月9日钢价预测:偏强运行
- 焦点观察:二字加一笔有哪些字20个_二字
- 【快播报】微视频|美丽中国新画卷
- 焦点滚动:OPPO Pencil 2 手写笔照片曝
- 环球即时看!女性角色人设变迁:从“雌竞
- 焦点热门:石和车读什么字_石车磲怎么读
- 【世界新要闻】复刻三星Galaxy S23系列
- 全球聚焦:模型公司有前途吗_模型公司
- 天天观焦点:广汽本田缤智车主评论_广汽
- 每日消息!不问苍生问鬼神全诗下一句_不问
- 世界微资讯!传奇世界私服
- 【新要闻】慈禧的儿子是谁
- 环球视讯!工商执照注册号怎么查_工商营
- 天天快播:海苔是什么
- 环球热门:子宫全切怎么同房_子宫全切除后
- 每日快看:2023女足世界杯海报发布 女性
- 天天热点评!倾城之恋张爱玲
- 天天最新:爆笑角斗士粤语高清
- 环球热文:这个杀手不太冷男主角
- 全球速递!飞利浦剃须刀hq851换电池(飞
- 当前简讯:沃森生物:融资余额62.1亿元,
- 天天看点:利昂
- 全球微速讯:光腿神器已经过时,现在流行
- 每日视点!闲人挖宝记
- 环球快播:b4纸尺寸对照表_b4纸尺寸
- 世界热消息:怎样修改桌面快捷方式的图标
- 当前最新:昆山礼品公司
- 环球快报:塔河县召开全国“两会”期间县
- 环球通讯!热敏打印机的头在哪
- 动态:华阳变速(839946)3月7日游资资金
- 热议:领主类网游小说完本推荐
- 焦点讯息:重庆渝中:阳光成长行动计划启
- 【世界热闻】天津渤海职业学院咨询热线_
- 当前要闻:阳了应该怎么办-阳性感染者如
- 当前看点!枸骨是否有抗癌的功效_枸骨是什
- 环球要闻:输掉榜首大战!C罗差点又扔队
- 【报资讯】客观的意思有哪些_客观的意思
- 【世界热闻】qq群发怎么发所有人
- 快看点丨梦色糕点师安利_梦色糕点师之希逸
- 世界最资讯丨新媒:中美经贸关系“分手很
- 焦点速递!3月9日钢价预测:偏强运行
- 焦点观察:二字加一笔有哪些字20个_二字
- 【快播报】微视频|美丽中国新画卷
- 焦点滚动:OPPO Pencil 2 手写笔照片曝
- 环球即时看!女性角色人设变迁:从“雌竞
- 焦点热门:石和车读什么字_石车磲怎么读
- 【世界新要闻】复刻三星Galaxy S23系列
- 全球聚焦:模型公司有前途吗_模型公司
- 天天观焦点:广汽本田缤智车主评论_广汽
- 每日消息!不问苍生问鬼神全诗下一句_不问
- 世界微资讯!传奇世界私服
- 【新要闻】慈禧的儿子是谁
- 环球视讯!工商执照注册号怎么查_工商营
- 天天快播:海苔是什么
- 环球热门:子宫全切怎么同房_子宫全切除后
- 每日快看:2023女足世界杯海报发布 女性
- 天天热点评!倾城之恋张爱玲
- 天天最新:爆笑角斗士粤语高清
- 环球热文:这个杀手不太冷男主角
- 全球速递!飞利浦剃须刀hq851换电池(飞
- 当前简讯:沃森生物:融资余额62.1亿元,
- 天天看点:利昂
- 全球微速讯:光腿神器已经过时,现在流行
- 每日视点!闲人挖宝记
- 环球快播:b4纸尺寸对照表_b4纸尺寸
- 世界热消息:怎样修改桌面快捷方式的图标
- 当前最新:昆山礼品公司
- 环球快报:塔河县召开全国“两会”期间县
- 环球通讯!热敏打印机的头在哪
- 动态:华阳变速(839946)3月7日游资资金
- 热议:领主类网游小说完本推荐
- 焦点讯息:重庆渝中:阳光成长行动计划启
- 【世界热闻】天津渤海职业学院咨询热线_
- 今日视点:k810i
- 天天微动态丨大庆市强化监管净化保健食品
- 世界新动态:LOL游戏回复好友_lol游戏内
- 全球消息!内业资料范本_内业资料是什么
- 当前最新:马拉多纳的外号_马拉多纳的介绍
- 看点:蝉的幼虫叫什么_蝉的幼虫叫什么
- 世界实时:最新消息!刘国梁要举办世界乒
- 当前信息:2022年末伏几月几号几分几秒
- 每日观点:红旗发布E702官图:支持“点对
- 全球视讯!52pk游戏
- 世界速递!热汤面条的做法 家常_热汤面
- 世界快看:臭咸鸭蛋能吃吗专家解释_臭咸
- 世界新资讯:二哥影院
- 今日最新!商丘梁园区法院召开年度工作总
- 世界速递!台球瞄准方法的基本技巧
- 天天看点:同上一堂课官网网址是哪个?
- 世界快资讯丨法护校园 “典”亮生活
- 天天快看:吴中区人力资源和社会保障局提
- 快讯:ipad第五代尺寸_ipad第五代
- 当前速读:东江湖钓鱼