文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
goroutine
goroutine
是 Go
并行设计的核心。 goroutine
说到底其实就是协程,但是它比线程更小,十几个 goroutine
可能体现在底层就是五六个线程,Go 语言内部实现了这些 goroutine
之间的内存共享。执行 goroutine
只需极少的栈内存(大概是 4~5KB),当然会根据相应的数据伸缩。也正因为如此,可同时运行成千上万个并发任务。 goroutine
比 thread
更易用、更高效、更轻便。
goroutine
是通过 Go 的 runtime
管理的一个线程管理器。 goroutine
通过 go
关键字实现了,其实就是一个普通的函数。
go hello(a, b, c)
通过关键字 go 就启动了一个 goroutine
。来看一个例子
package main
import (
"fmt"
"runtime"
)
func say(s string) {
for i := 0; i < 5; i++ {
runtime.Gosched()
fmt.Println(s)
}
}
func main() {
go say("world") //开一个新的 Goroutines 执行
say("hello") //当前 Goroutines 执行
}
// 以上程序执行后将输出:
// hello
// world
// hello
// world
// hello
// world
// hello
// world
// hello
可以看到 go 关键字很方便的就实现了并发编程。
上面的多个 goroutine
运行在同一个进程里面,共享内存数据,不过设计上要遵循:不要通过共享来通信,而要通过通信来共享。
runtime.Gosched()
表示让 CPU 把时间片让给别人,下次某个时候继续恢复执行该 goroutine
。
默认情况下,在 Go 1.5 将标识并发系统线程个数的 runtime.GOMAXPROCS
的初始值由 1 改为了 运行环境的 CPU 核数
。
但在 Go 1.5 以前调度器仅使用单线程,也就是说只实现了并发。想要发挥多核处理器的并行,需要程序中显式调用 runtime.GOMAXPROCS(n)
告诉调度器同时使用多个线程。 GOMAXPROCS
设置了同时运行逻辑代码的系统线程的最大数量,并返回之前的设置。如果 n < 1
,不会改变当前设置。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论