Go 协程 (goroutine) 是指在后台中运行的轻量级执行线程,go 协程是 Go 中实现并发的关键组成部分。
在上次的课程中,我们学习了 Go 的并发模型。由于 Go 协程相对于传统操作系统中的线程 (thread) 是非常轻量级的,因此对于一个典型的 Go 应用来说,有数以千计的 Go 协程并发运行的情形是十分常见的。并发可以显著地提升应用的运行速度,并且可以帮助我们编写关注点分离(Separation of concerns,Soc)的代码。
什么是 Go 协程?
我们也许在理论上已经知晓 Go 协程是如何工作的,但是在代码层级上,go 协程何许物也?其实,go 协程看起来只是一个与其他众 Go 协程并发运行的一个简单函数或者方法,但是我们并不能想当然地从函数或者方法中的定义来确定一个 Go 协程,go 协程的确定还是要取决于我们如何去调用。
Go 中提供了一个关键字 go
来让我们创建一个 Go 协程,当我们在函数或方法的调用之前添加一个关键字 go
,这样我们就开启了一个 Go 协程,该函数或者方法就会在这个 Go 协程中运行。
举个简单的栗子:
https://play.golang.org/p/pIGsToIA2hL
在上面的代码中,我们定义了一个可以在控制台输出 Hello World
字符串的 printHello
的函数,在 main
函数中,我们就像平时那样调用 printHello
函数,最终也是理所当然地获得了期望的结果。
下面,让我们尝试从同一个函数创建 Go 协程:
https://play.golang.org/p/LWXAgDpTcJP
根据 Go 协程的语法,我们在函数调用的前面增加了一个 go
关键字,之后程序运行正常,输出了以下的结果:
main execution started
main execution stopped
奇怪的是,Hello World
并没有如同我们预料的那样输出,这期间究竟发生了什么?
go 协程总是在后台运行,当一个 Go 协程执行的时候(在这个例子中是 go printHello()