长安链 DApp 开发必学 Go 16:协程

95 阅读1分钟

Go 是为 Web 而生的语言,而 Web 的本质就是网络 IO。

贴一张很重要的计算机各部件访问延迟图片:

image.png

可以看到,相比于 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,下一章见。