在 Go 语言中,每一个并发的执行单元叫作一个 goroutine,goroutine 的概念类似于线程,属于用户态的线程, 是由 Go 的运行时(runtime)调度和管理的。
每一个 OS 线程都有一个固定大小的内存块(一般会是2MB)来做栈,这个栈会用来存储当前正在被调用或挂起(指在调用其它函数时)的函数的内部变量。相反,一个 goroutine 会以一个很小的栈开始其生命周期,一般只需要 2KB。一个 goroutine 的栈,和操作系统线程一样,会保存其活跃或挂起的函数调用的本地变量,但是和 OS 线程不太一样的是一个 goroutine 的栈大小并不是固定的;栈的大小会根据需要动态地伸缩。而 goroutine 的栈的最大值有 1GB,比传统的固定大小的线程栈要大得多,尽管一般情况下,大多 goroutine 都不需要这么大的栈。
Go 语言中使用 goroutine 非常简单,只需要在调用函数或方法的时候在前面加上 go 关键字,就可以为一个函数创建一个 goroutine。当一个程序启动时,其 main() 函数即在一个单独的 goroutine 中运行,我们叫它 main goroutine,尽管它并没有通过 go 来启动。
不过由于主线程有可能先于 hello 协程退出,先用最简单的办法,sleep 一秒等待输出。
func hello(){
fmt.Println("Hello")
}
func main(){
go hello()
time.Sleep(1)
}
GPM 是 Go 语言运行时(runtime)层面的实现,是 go 语言自己实现的一套调度系统。区别于操作系统调度 OS 线程。
P 的个数是通过 runtime.GOMAXPROCS 设定(最大256),Go 1.5版本之后默认为物理线程数。 M 的个数是不定的,由 Go Runtime 调整,默认最大限制为 10000 个。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。