Go并发
Go 语言的并发是基于 goroutine
的,goroutine
类似于线程,但并非线程。可以将 goroutine
理解为一种虚拟线程。Go 语言运行时会参与调度 goroutine
,并将 goroutine
合理地分配到每个 CPU 中,最大限度地使用 CPU 性能。开启一个 goroutine 的消耗非常小(大约 2KB 的内存),你可以轻松创建数百万个goroutine
。
goroutine
goroutine 语法格式:
go 函数名( 参数列表 )
演示代码如下
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
fmt.Println("over!")
}
执行上面代码将会输出
hello
world
world
hello
hello
over!
其中 hello 与 world 每次执行顺序都不一致,甚至有时候 world 会少输出一遍,或是 world 将会在 over! 后输出。因为此时的go say("world")
不在是主线程中执行,而是创建一个 goroutine 去执行。可以认为go say("world")
就相当于 js 中的await say("world")
但 js 是单线程基于事件循环机制来实现的,所以两者还是有着一定的区别。