实时

您的位置:首页>资讯 >

[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 关键字就可以提高程序执行速度。

关键词:

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

2023-03-13 14:59:22

1 打架斗殴一般属于民事案件,构成轻伤以上的属于刑事案件。2 在对打架斗殴进行定性的时候,需要结合后果分析。3 如果只是给对方造成了轻微伤

2023-03-13 13:02:12

“植”此青绿共创品质高新

2023-03-13 10:13:20

1、植物志,记载某个国家或某一地区植物种类(植物区系)的分类学专著。2、一般依分类系统编排(如恩格勒系统、哈钦松系统

2023-03-13 08:06:06

@西城大妈:好多人,不光是刚毕业的学生,甚至是工作多年的文员,对于职场和社会都有一个不切实际的想法,就是自己进了一个机构,不管是公司还

2023-03-13 03:03:38

1、菊花枸杞可以泡茶喝.菊花枸杞茶其实不是茶,只是用菊花和枸杞当茶一样泡着喝。2、菊花要用杭菊花,一到秋季,采摘下来,

2023-03-12 21:56:28

1、  引导语:德国是一个理性的民族,他们教育孩子的方法是怎么样的呢?以下是小编整理的德国人奇特的教育方法,欢迎参考!2

2023-03-12 17:46:09

做大尺寸硅钢片250冲压模的板老‬‬咨询:我们也是某顺电渣DC53料,为什么你们的行,我们的硅钢片冲压模具用不住?誉辉模具钢黄子鹏想说,DC53

2023-03-12 14:11:59

1、这里最多用到5个按键,确定你能找到,“shift“(左右各一个,挺大的按键),“-”(在键盘靠上的0按键的右边第一个

2023-03-12 10:06:49

1、风车之国的风车是用来磨面的。2、古代的风车,是从船帆发展起来的,它具有6~8副像帆船那样的篷,分布在一根垂直轴的四周

2023-03-12 05:40:52

走近春天遇见美好——临沂北城二期周末赏光指引

2023-03-11 23:10:15

1、这是清晰枪版:magnet:?xt=urn:btih:B1E9FDBF331B1002B98A02966B21D4A

2023-03-11 18:59:19

03月11日12时贵州遵义疫情数据阳了以后为什么会腰疼?应该怎么办?以下为详情!一、03月11日12时遵义疫情数据概览

2023-03-11 15:16:58

1、撕开外包装,拉动拉绳,自动将水与加热包混合,加热或煮好米饭,过一会儿就可以食用了。2、自热饭自带加热袋,遇水立即在钟

2023-03-11 13:17:29

山阴一女子闫某某行政拘留

2023-03-11 11:21:14

1、先登陆网站。2、接着注册一个账户名。3、就可以发布了。本文就为大家分享到这里,希望小伙伴们会喜欢。

2023-03-11 08:11:11

1、VERNA瑞纳在经济、技术、空间、时尚等方面卓然而立的优势与VERNA瑞纳“彰显不凡品味”、“V 我非凡”的品牌气质

2023-03-11 07:49:39

26岁“青你选手”蒋智豪肺癌晚期,年轻人肺癌和老年人有啥不同?

2023-03-11 05:33:08

1、双缩脲试剂的配制取10g氢氧化钠放入量筒中,加水至100mL,待充分溶解后倒入试剂瓶中,配成质量浓度为0 1g mL

2023-03-11 00:03:06

1、但据我们所知,从WindowsXP开始,Windows已经不再默认提供睡眠按钮,这使得我们必须在关机窗口中按下S

2023-03-10 22:07:02