善用 goroutine 能够充分利用多核资源,Leaf 提供的 Go 机制解决了原生 goroutine 存在的一些问题:
log.Debug("1")
// 定义变量 res 接收结果
var res string
skeleton.Go(func() {
// 这里使用 Sleep 来模拟一个很慢的操作
time.Sleep(1 * time.Second)
// 假定得到结果
res = "3"
}, func() {
log.Debug(res)
})
log.Debug("2")
上面代码执行结果如下:
2021/06/16 20:37:17 [debug ] 1
2021/06/16 20:37:17 [debug ] 2
2021/06/16 20:37:18 [debug ] 3
这里的 Go 方法接收 2 个函数作为参数,第一个函数会被放置在一个新创建的 goroutine 中执行,在其执行完成之后,第二个函数会在当前 goroutine 中被执行。由此,我们可以看到变量 res 同一时刻总是只被一个 goroutine 访问,这就避免了同步机制的使用。Go 的设计使得 CPU 得到充分利用,避免操作阻塞当前 goroutine