当前位置: 首页 > 工具软件 > Leaf-go > 使用案例 >

Leaf-Server官方教程: Leaf Go / Leaf timer / Leaf recordfile (五)

闻人嘉颖
2023-12-01

Leaf Go

善用 goroutine 能够充分利用多核资源,Leaf 提供的 Go 机制解决了原生 goroutine 存在的一些问题:

  • 能够恢复 goroutine 运行过程中的错误
  • 游戏服务器会等待所有 goroutine 执行结束后才关闭
  • 非常方便的获取 goroutine 执行的结果数据
  • 在一些特殊场合保证 goroutine 按创建顺序执行我们来看一个例子(可以在 LeafServer 的模块的 OnInit 方法中测试):
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

 类似资料: