这篇文章将关注 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 关键字就可以提高程序执行速度。
关键词:
这篇文章将关注Go语言基础部分。我们将讨论关于性能方面的一些知识,并通过创建一些简单的goroutine来扩展我们的应用程序。2023-03-14
如今,汽车越来越受欢迎。基本上每家每户很快都会有一辆车。所以当汽车这么多的时候,我们在用车的过程中肯定会遇到各种各样的问2023-03-13
丽尚国潮:丽尚国潮独立董事关于聘任高级管理人员的独立意见2023-03-13
又一知名APP涉黄,“软色情”为何无孔不入?,直聘,招嫖,涉黄,app,聊天室,软色情2023-03-13
1、首先,我们进入dnf助手。2、然后点击左上角的三个水平符号。3、然后单击发现功能。4、然后我们会选择网吧的特权。5、2023-03-13
股指:燃油车降价引风波,股指观望;近期部分燃油车生产大厂,结合本省的的优势,大幅降价,燃油车大幅降级去库存,反映了近两年2023-03-13
1、栗子炖鸡是一道经典的滋补菜肴。栗子配鸡肉能补肾肾虚,益脾胃。适合肾虚的人食用,也是健康人强身健体的美味食品。栗子炖鸡2023-03-13
1、Dragon龙abortion龙LUNG龙DRAGON龙。本文分享完毕,希望对大家有所帮助。2023-03-13
1、还没有小孩,但是因为工作原因,上半年曾走访过几家幼儿园,我站在旁观者的角度回答一下这个问题。2、显而易见,公立和私立幼儿园各有优缺2023-03-13
上篇连接ooc加私设。现代背景。一片漆黑之中,只能听见自己紧张心跳,与沉重的呼吸,神子缓慢的向前挪着步子。混沌的前方几步之外的位置,渐渐2023-03-12
一、广州将迎来山景保障房广州今年将迎来望江共有产权房,还有山景保障房也正在装修中,它们的选址都在地铁站附近,出行便利。萝2023-03-12
中国网财经3月12日讯在12日举行的十四届全国人大一次会议第三场“部长通道”上,国家统计局局长康义接受记者采访,回应社会各界关切。以下为文2023-03-12
1、公司始建于1958年,2002年改制为“高密春雨机械有限公司”,2007年1月1日正式更名为“山东金亿机械制造有2023-03-12
1、成语概览基本信息【汉语简体】一衣带水一衣带水(草书)【汉语注音】yìyīdàishuǐ【汉语释义】像一条衣2023-03-12
1、首先你要正视这个问题,这样是很正常的,然后你要找出你们平淡的原因来。2、如果你们相处时间非常的长,那就应该试着分开一2023-03-11
3月11日,中国人民政治协商会议第十四届全国委员会第一次会议在北京人民大会堂举行闭幕会。新华社记者曹灿摄3月11日,中国人民政治协商会议第2023-03-11
1、我自己拍的,基本只能这样了,除非到它附近的楼顶上拍,因为附近都是建筑和树 。本文就为大家分享到这里,希望小伙伴们会喜2023-03-11
1、为他人牺牲自己。2、相关介绍:3、舍己为人,中国成语,解释为:本义是放弃自己的主张,附和他人。现在的意思是放弃自己的2023-03-11
在如今竞争激烈的数字化环境中,数字营销对于小型企业的成功至关重要。目前,网络流量的一半以上都来自移动设备,如何在移动设备上做好推广成2023-03-11
1、淘宝培训网是一家专业网店培训网,服务对象致力于网上零售业的企业及个体,致力于网上经营培训。2、帮助广大学员获取全面的2023-03-11
蓝黑军团国际米兰在本赛季虽然早早无缘联赛冠军的争夺,但是他们在欧冠赛场却取得了突破,在被分到死亡之组的情况下,顺利从小组赛突围成功,2023-03-11
欢迎观看本篇文章,小勉来为大家解答以上问题。古朴典雅的意思是什么,怎么理解古朴典雅的意思很多人还不知道,现在让我们一起来2023-03-11
1、更新Win10的方案:方法1:打开开始菜单,点击设置按钮。2、图一打开设置界面,在里面打开更新和安全。3、图二在Windows更新处点击“检查更2023-03-10
1、计算机科学与技术(ComputerScienceandTechnology)是国家一级学科,下设信息安全、软件2023-03-10
你们好,最近小活发现有诸多的小伙伴们对于稻城旅游攻略必去景点,稻城旅游攻略这个问题都颇为感兴趣的,今天小活为大家梳理了下2023-03-10