Go 是为 Web 而生的语言,而 Web 的本质就是网络 IO。
贴一张很重要的计算机各部件访问延迟图片:
可以看到,相比于 CPU 内部的缓存 IO、内存 IO,网络 IO 相差了好几个数量级。
举例,一个单核单线程 CPU,创建 100 个线程来处理网络 IO。
为了并发处理网络 IO,100 个线程频繁的进行大量切换,可能都等不来一次网络 IO 操作。
因此,聪明的工程师们想到了一个办法——协程 (goroutine),也叫微线程,轻量线程。
通过在一个线程内开启多个协程,避免了大量线程的切换损耗,还能通过编码自主控制协程的调用,从而实现 IO 的并发操作。
极大的提高服务器的 IO 吞吐量,非常适合高并发的业务场景。
上代码:
package main
import (
"fmt"
"time"
)
func say(s string) { // 每隔 1s 打印一次传入的字符串,共打印 5 次
for i := 0; i < 5; i++ {
time.Sleep(1000 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world") //使用 go 关键字开启一个协程来执行
say("hello")
}
上述代码会交替打印 world 和 hello。如果不使用协程,则需要等待 world 打印完,才会打印 hello。
ok,下一章见。